Читать «Полный справочник по С++» онлайн - страница 17

Герберт Шилдт

Язык С содержит ключевое слово auto, которое можно использовать для объявления локальных переменных. Однако, поскольку все локальные переменные по умолчанию считаются автоматическими, это ключевое слово на практике никогда не используется. По этой причине в нашем справочнике мы также не будем его применять. (Говорят, что ключевое слово auto было включено в язык С для обеспечения совместимости с его предшественником — языком В. Затем это слово перекочевало в язык C++ для обеспечения совместимости с языком С.)

Из соображений удобства и по традиции большинство программистов объявляют все переменные, используемые в функции, сразу после открывающей фигурной скобки и перед всеми остальными операторами. Однако следует иметь в виду, что локальные переменные можно объявлять в любом месте блока. Рассмотрим следующий пример.

void f(void) int t;

scanf("%d%*c", &t); if(t==l) {

char s[80]; /* Эта переменная создается только при входе в данный блок */ printf("Введите имя:"); gets(s);

/* Некие операции ... */

}

}

В этом фрагменте локальная переменная s создается при входе в блок if и разрушается сразу после выхода из него. Кроме того, переменная s является видимой только внутри блока if, и к ней невозможно обратиться извне, даже из других частей функции, содержащей данный блок.

Объявление переменных внутри блоков позволяет избежать побочных эффектов. Поскольку локальная переменная вне блока не существует, ее значение невозможно изменить непреднамеренно.

Способы объявления локальных переменных в языке С (в соответствии со стандартом С89) и в языке C++ существенно отличаются друг от друга. В языке С все локальные переменные должны быть объявлены в начале блока до выполнения каких-либо “активных” операторов. Например, попытка объявить локальные переменные так, как показано в приведенном ниже фрагменте, вызовет ошибку.

/* Если эта функция является частью программы на языке С, при компиляции возникнет ошибка. Если эта функция представляет собой часть программы на языке C++, ошибок не будет.

*/

void f(void) int i ; i = 10;

int j; /* Этот оператор порождает ошибку */ j = 20;

Между тем, в языке C++ эта функция считается абсолютно правильной, поскольку в этом языке локальные переменные можно объявлять в любом месте блока, но до их первого использования. (Более подробно эта тема будет рассматриваться во второй части книги.) Интересно, что стандарт С99 также позволяет объявлять локальные переменные где угодно.

Поскольку локальная переменная создается при входе в блок, где она объявлена, и разрушается при выходе из него, ее значение теряется. Это особенно важно учитывать при вызове функции. Локальные переменные функции создаются при ее вызове и уничтожаются при возврате управления в вызывающий модуль. Это значит, что между двумя вызовами функции значения ее локальных переменных не сохраняются. (Заставить их сохранять свои значения можно с помощью модификатора static.)

По умолчанию локальные переменные хранятся в стеке. Поскольку стек является динамической структурой, и объем занимаемой им памяти постоянно изменяется, становится понятным, почему локальные переменные в принципе не могут сохранять свои значения между двумя вызовами функции, внутри которой они объявлены.