Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Козак Н.В. Лекции Основы создания программ в Си...doc
Скачиваний:
24
Добавлен:
23.09.2019
Размер:
2.24 Mб
Скачать

Лекция.2.Язык Си Обзор элементов языка Си Типизированные константы

Разновидностью переменных являются типизированные константы. Это переменные, значение которых (заданное при инициализации) нельзя изменить.

Для создания перед оператором объявления ставится ключевое слово const:

const тип имя_константы = значение [, . . . ] ;

Например:

const double Pi = 3.14159265;

Область действия переменных

Переменные в С могут быть локальными и глобальными, статическими и автоматическими, регистровыми, внешними и даже нестабильными. Они различаются областью действия, видимостью и временем жизни.

Область действия

Область действия — это та часть программы, где переменная в принципе доступна для программного кода (что означает это «в принципе», выяснится чуть позже). По своей области действия переменные делятся на локальные и глобальные.

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

#include <stdio.h>

int iVar = 111; // Глобальная переменная.

void func1(void)

{

int iVar = 222; // Локальная переменная Funcl().

/* Локальная переменная скрывает глобальную. */

printf("Значение iVar в fund О равно %d.\n", iVar);

}

void func2(void)

{

/* Глобальная переменная доступна. */

printf("Значение iVar в func2() равно %d.\n", iVar) ;

iVar = 333; // Изменяет глобальную переменную.

}

int main(void)

{

printf("Начальное значение iVar: %d.\n", iVar); // Печатает 111.

func1(); // Печатает 222, но не изменяет глобальную iVar.

printf("После вызова funclO : %d.\n", iVar);

func2(); // Печатает 111 и изменяет iVar на 333.

printf("После вызова func2(): %d.\n", iVar);

return 0;

}

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

Если имя глобально и локальной переменной совпадают это допустимая ситуация.Но в этом случае локальная переменная скрывает глобальную с тем же именем. Тут речь идет о их области видимости которая не совпадает с областью действия.

Время жизни

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

Локальная переменная создается при входе в функцию и уничтожается при возврате из нее. Она является автоматической переменной. Нельзя ожидать, что локальная переменная будет сохранять свое значение в промежутках между вызовами объявляющей ее функции. Локальная переменная сохраняет значение между вызовами функции, если объявлена с модификатором static::

int aFunc(void)

{

/* Так можно организовать счетчик вызовов функции. */

static int callCount = 0;

// Здесь что-то делается...

return ++callCount;

}

Статическая локальная переменная очень похожа на глобальную, память для нее отводится в той же области. Но областью действия локальная статической переменная является все-таки объявляющая функция; вне ее переменная недоступна.

Модификаторы переменных

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

register. Этот модификатор рекомендует компилятору разместить локальную переменную в регистре процессора, если это возможно.

extern. Модификатор говорит компилятору, что переменная является внешней, т.е. объявлена в другом файле.

volatile. применяется для объявления переменных, которые можно назвать нестабильными. Значение такой переменной может изменяться само по себе, например, некоторым фоновым процессом или аппаратно. Компилятор не должен пытаться как-либо оптимизировать выражения, в которые входит переменная.