Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Программирование и основы алгоритмизации УТС / Лекции / 22. Локальные и глобальные переменные

.pdf
Скачиваний:
42
Добавлен:
17.03.2016
Размер:
130.75 Кб
Скачать

Локальные и глобальные переменные

В зависимости от места описания, переменные делятся на локальные и глобальные. Локальные переменные – это переменные, определенные внутри какого-либо блока.

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

#include <stdio.h>

void main(void)

{

int k = 1;

...

{

int x = 5; k = x;

}

...

printf("%d\n", k);

}

В приведенном примере переменная k является локальной в теле функции main, а переменная x – локальной внутри вложенного блока, в котором, однако, также действует и переменная k. Это позволяет обратиться к ней внутри вложенного блока и, очевидно, в последней строке будет напечатано «5». Но переменная x существует только внутри вложенного блока и попытка обратиться к ней за его пределами (например, в строках с многоточиями) приведет к ошибке во время компиляции.

Глобальные переменные – это переменные, определенные вне какого-либо блока, т.е. в глобальном пространстве вне какой-либо функции. Такие переменные действуют с момента их описания и до конца программы (т.е. во всех блоках на этом интервале), а время их жизни равно времени работы программы:

#include <stdio.h>

#include <stdio.h>

int x = 5;

void main(void)

void main(void)

{

int k = 1;

{

x = k;

int k = 1;

x = k;

printf("%d\n", x);

}

printf("%d\n", x);

int x = 5;

}

...

...

Впримере слева глобальная переменная x определена выше по тексту относительно

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

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

Вто же время, является допустимым и не приводит к ошибке описание переменных

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

int x = 5;

/* x типа int */

...

void main(void)

{

double x = 3.14159265357898; /* x типа double */

...

{

char x = 'A';

/* x типа char */

...

}

/* опять x типа double */

...

}

/* опять x типа int */

...

В данном примере существуют три разных переменных x, определенных в глобальном, локальном и вложенном пространствах (переменные определены с разными типами только для удобства анализа данного примера). Очевидно, что области действия этих переменных пересекаются, но в каждом случае приоритет имеет «более локальная» переменная. При завершении блока завершается и ее область действия, при этом опять становится доступна та переменная, которая была доступна до начала этого блока. Таким образом, локальная переменная «скрывает» одноименный идентификатор, действовавший в охватывающем пространстве. В подобной ситуации не выдается никаких сообщений об ошибках или предупреждений, а также не существует способов обратиться к «скрытой» переменной. Однако, подобные ситуации при некорректном использовании могут приводить к неправильной, с точки зрения разработчика, работе программы и создавать сложности при ее отладке.