Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по информатике.doc
Скачиваний:
118
Добавлен:
02.05.2014
Размер:
1.53 Mб
Скачать

Автоматические (локальные) переменные

Некоторые функции нуждаются в собственных переменных и константах.

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

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

Например, в следующей функции use_abc объявляется три локальные переменные a, b и с:

void use_abc(void)

{

int a, b, с;

а=3;

b=а+1;

с = а + b;

printf("aсодержит %dbсодержит %dс содержит %d\n", а,b, с);

}

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

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

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

inttemp;

main()

Здесь переменная 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);

}

В действительности, в зависимости от выбора места определения глобальной переменной, можно контролировать набор функций, имеющих доступ к этой переменной. Другими словами, можно управлять областью действия глобальных переменных. При определении в программе глобальной переменной эта переменная может использоваться в функциях, определения которых располагаются после объявления этой переменной и до конца исходного файла. Функции, определения которых располагаются до определения глобальной переменной, не имеют доступа к этой переменной. Например, рассмотрим следующую программу, в которой определяется глобальная переменная title:

#include <stdio.h>

void unknown_title(void)

{

printf("Название книги %s\n ", title);

}

char title[] = "1001 совет по C/C++";

void main(void)

{

printf("Название: %s\n", title);

}

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

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

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

Использование автоматических переменных и передача значений в качестве аргументов позволит вам более успешно управлять ходом программы. Значение автоматической переменной может изменить только функция, в которой она определена. Если результат работы программы оказался неправильным, вам достаточно ввести дополнительные функции printf() для отображения значения каждой локальной переменной.