If (expression) {
int count = 0; // Объявление переменной в области действия // оператора if
...
}
cout << "count == " << count « '\n'; // ??? ОШИБКА!!!!
При компиляции последняя строка вызовет сообщение об ошибке, поскольку переменная count объявлена вне области видимости оператора if, она не существует вне ее.
Бывает полезно одновременно объявлять и инициализировать переменную, управляющую циклом for.
типичный цикл выглядит так:
Void f() {
int i;
for (i=0; i<MAX; i++)
}
В С++ можно объявить переменную для цикла непосредственно внутри него, сократив код до следующего:
Void f()
{ for (int i=0; i<MAX; i++)
...
}
Однако такое объявление действует не только в пределах видимости цикла for. Инициализация управляющей переменной (в данном случае i=0;) выполняется до того, как начнется цикл, таким образом, i в данном примере нопадает в область видимости f() и может использоваться любыми операторами, следующими за for.
Константы
Константы — новшество языка С++, заимствованное языком C.
Объявление переменных с ключевым словом const создает вокруг них "силовое поле", предохраняющее их от изменения во время выполнения программы.
ПРИМЕР: Если вы объявили целую переменную count следующим образом:
const int count =1234;
Компилятор выдаст сообщение об ошибке в операторе
count++; //???
Некоторые программисты рекомендуют использовать объявления const вместо символьных констант, созданных с помощью #define.
Символьная константа
#define МАХ 100
определяет макрос с именем МАХ, связанный с текстом 100 (не целым значением 100).
Если МАХ используется следующим образом:
for (int i=0; i<MAX; i++)
…
то компилятор заменит МАХ на текстовые цифры 100 и скомпилирует оператор так, как будто вы ввели эти цифры в этом месте.
Некоторые эксперты по С++ утверждают, что легко сделать ошибку при использовании символьных констант, подобных МАХ. Сторонники объявления const скорее предложат вам следующее:
const int MAX = 100;
Цикл for останется таким же, а объявление МАХ истинной константой даст определенные преимущества.
Компилятор сможет выполнить проверку типов с МАХ более строго. С++ распознает, что константа МАХ имеет тип int, в то время как компилятор ничего не знает о типе текстового макроса МАХ.
Turbo Debugger распознает истинную константу МАХ. Отладчикне распознает символьные константы, созданные с помощью #define.
Все это необходимо иметь в виду. К несчастью, истинная константа МАХ нуждается в постоянном месте хранения в сегменте данных программы. Многочисленные программные константы могут занимать сотни тысяч байтов, расходуя тем самым память. Более того, использование таких значений может потребовать отнимающих время обращений к памяти.
Обычно символьные константы используются как эффективные команды, загружающие значения прямо в регистры.
Истинные константы полезны в том случае, если они используются как переменные, значения которых в процессе выполнения программы не подлежат изменению.
Их преимущества не настолько велики, чтобы совсем отказываться от #define.
Встраиваемые функции
Одной из печальных истин программирования на языках, подобных С и С++, является то, что на вызов функций расходуется время.
Хотя вызов функции происходит быстрее, чем вы успеете глазом моргнуть, многочисленные вызовы могут ухудшить общее быстродействие программы. Полный отказ от функций — неприемлемое решение этой проблемы! Функции делают программу модульной и более легкой для поддержки. Без функций исключительно сложно, может быть, невозможно написать даже среднюю по размерам корректно работающую программу.
С другой стороны, разворачивание циклов и устранение многочисленных вызовов функций — стиль, сберегающий время и улучшающий общее быстродействие программы.
Рассмотрим следующий гипотетический цикл for:
for (int i = 0; i < MAX; i++) { AnyFunction();
. . .
}
Если значение МАХ слишком велико, многократные вызовы AnyFunction() могут занять достаточно много драгоценного времени вдобавок к общему времени выполнения программы. Предположим, AnyFunction() написана следующим образом: