Желательна инициализация переменных при их описании:
int i=1, j=0, k=2;
float x=0.25, y=-1.5;
char a=’W’;
Если при описании переменной использован модификатор const, то это означает, что значение переменной нельзя изменять в программе. Такую переменную называют именованнойконстантой. Она обязательно должна быть инициализирована:
const int i=1; //именованная целая константа i
const float x=0.25; //именованная вещественная константа x
const char a=’W’; //именованная символьная константа a
Класс памяти определяет время жизни и область видимости переменной:
auto – автоматическая переменная. Память под нее выделяется в стеке и при необходимости инициализируется каждый раз при выполнении оператора, содержащего ее описание. Освобождение памяти происходит при выходе из блока, в котором описана переменная. Время ее жизни – от момента описания до конца блока. Для локальных (описанных внутри блока) переменных спецификатор auto применяется по умолчанию, поэтому задавать его явным образом смысла не имеет;
extern – внешняя переменная. Эта переменная определяется в другом месте программы (в другом файле или дальше по тексту программы). Используется для создания переменных, доступных во всех модулях программы, в которых они объявлены. Если переменная в этом же описании инициализируется, то спецификатор extern игнорируется;
static – статическая переменная. Время ее жизни – постоянное. Инициализируется один раз при первом выполнении оператора, содержащего описание переменной. В зависимости от расположения оператора описания статические переменные могут быть глобальными (описаны вне любого блока, область их действия – весь файл, в котором они описаны) и локальными (описаны внутри блока). Глобальные статические переменные видны только в том модуле, в котором они описаны;
register – регистровая переменная. Память для нее выделяется в регистрах процессора. Если такой возможности у компилятора нет, переменные обрабатываются как auto:
int a; //глобальная переменная a
void main() //заголовок головной программы
{ //начало блока головной программы
int b=1; //локальная переменная b
extern float x;//переменная x определена в другом месте
static int c=0;//локальная статическая переменная c
register char d=’W’; //регистровая переменная d
a=1; //присваивание значения глобальной переменной a
int a; //описание локальной переменной a
//с этого момента и до конца блока действует
//только локальная переменная a
a=0; //присваивание значения локальной переменнойa
. . . . . . . . .
return 0;
} //конец блока головной программы
float x=1.5;//определение и инициализация внешней переменнойx
В этом примере:
глобальная переменная a определена вне всех блоков. Память под нее выделяется в сегменте данных в начале работы программы, областью действия и областью видимости является вся программа до оператора описания одноименной локальной переменной a;
локальные переменные b и c определены внутри блока, поэтому область их видимости – весь блок от момента их описания. Память под b выделяется в стеке при входе в блок и освобождается при выходе из него. Переменная с располагается в сегменте данных и существует все время, пока работает программа.
Если при определении начальное значение переменной явным образом не задано, то компилятор присваивает глобальным и статическим переменным нулевые значения соответствующего типа. Автоматические переменные в этом случае не инициализируются.
Описание переменной может выполняться в форме объявления или определения.
Объявление описывает свойства переменной, информируя компилятор о типе переменной и классе памяти. Определение содержит, кроме того, указание компилятору о выделении памяти в соответствии с типом переменной, то есть связывает переменную с конкретной областью памяти. В Си большинство объявлений являются одновременно и определениями. В приведенном выше примере только описание
extern float x;
является объявлением, но не определением.
Переменная может быть объявлена многократно, но определена только в одном месте программы.