Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lek_1_slaydy.doc
Скачиваний:
1
Добавлен:
17.11.2019
Размер:
417.79 Кб
Скачать

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() на­писана следующим образом:

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]