Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование на C / C++ / Нейбауэр А. Моя первая программа на С.doc
Скачиваний:
182
Добавлен:
02.05.2014
Размер:
3.75 Mб
Скачать

Внешние (глобальные) переменные

Внешние переменные — это переменные, которые может использовать любая функция программы. В некоторых языках они носят название глобальных переменных. Для того чтобы создать внешнюю переменную, ее следует определить перед функцией main():

int temp;

main()

Здесь переменная temp определена как внешняя, так что с ней могут работать все функции, содержащиеся в программе. Посмотрите на текст программы, приведенный в Листинге7.3. Переменная temp является внешней и ее используют функции main(), convert(), freeze() и boil(). Значение переменной, введенное в main(), используется при расчетах другими функциями. В программе присутствует еще одна переменная — celsius. Поскольку значение переменной celsius используется только функцией convert(), переменная определена внутри этой функции, являясь, таким образом, локальной переменной, которая не может использоваться нигде кроме convert().

Листинг 7.3. Программа, содержащая внешнюю переменную.

/*f_to_c.c*/

int temp;

main()

{

printf("Введите значение температуры: ");

scanf("%d", &temp);

convert();

freeze();

boil();

}

convert()

{

float celsius;

celsius = (5.0 / 9.0) * (temp - 32);

printf("%d градусов по шкале Фаренгейта соответствует %6.2f градусам \

по шкале Цельсия\n", temp, celsius);

return(0);

}

freeze()

{

printf("Это составляет %d градусов от точки замерзания воды\n", temp-32);

return(0);

}

boil()

{

printf("Это составляет %d градусов от точки кипения воды\n", 212-temp);

return(0);

}

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

Статические переменные

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

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

Тем не менее, значение, присвоенное переменной, можно сохранить в памяти и после окончания выполнения функции, если определить эту переменную как статическую. Это делается следующим образом:

myfunc()

{

static int count;

}

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

Для того чтобы пояснить, что такое статическая переменная, рассмотрим следующий пример. Посмотрите на программу, приведенную в Листинге7.4. Вэтом фрагменте статические переменные не используются. Функция doit() вызывается четырежды, и каждый раз при этом двум переменным присваивается начальное значение 0, которое отображается с помощью функции printf(). Впроцессе работы функции, значение каждой переменной увеличивается на единицу. Однако значение переменных теряется после очередного завершения работы функции, а при следующем вызове им снова присваивается начальное значение0, так что результат работы программы выглядит так:

значение autovar равно 0 значение statvar равно 0

значение autovar равно 0 значение statvar равно 0

значение autovar равно 0 значение statvar равно 0

значение autovar равно 0 значение statvar равно 0

Листинг 7.4. Программа, иллюстрирующая использование локальных переменных.

/*stat.c*/

main()

{

doit();

doit();

doit();

doit();

}

doit()

{

int autovar = 0;

int statvar = 0;

printf("значение autovar равно %dзначение statvar \

равно %d\n", autovar, statvar);

++autovar;

++statvar;

return(0);

}

Давайте теперь слегка изменим определение переменных в функции doit(), с тем чтобы создать статическую переменную:

static int statvar = 0;

При выполнении программы со статической переменной мы получим следующий результат:

значение autovar равно 0 значение statvar равно 0

значение autovar равно 0 значение statvar равно 1

значение autovar равно 0 значение statvar равно 2

значение autovar равно 0 значение statvar равно 3

При первом выполнении функции переменной statvar присваивается начальное значение, равное 0. Однако statvar определена как статическая переменная, что указывает компилятору на необходимость сохранения в памяти присвоенного ей значения и после завершения работы функции. Поэтому после первого завершения работы функции переменная statvar будет иметь значение, равное 1, которое получается благодаря инструкции ++statvar;. При следующем вызове функции исходным значением переменной является сохраненное за ней значение1 и поэтому присваивания ей 0 в качестве начального значения не производится.

Каждый раз во время выполнения функции значение переменной увеличивается, и это новое значение сохраняется за переменной при очередном вызове функции.