В функции otherпеременная i переопределяется как локальная переменная с начальным значением 16. Это не влияет на значение внешней переменной i, поскольку эти переменные никак не связаны между собой. Переменная а объявляется со спецификацией класса памяти staticи начальным значением 2. Она никак не связана с переменной а, объявленной в функции main, так как область действия переменных класса памяти staticна внутреннем уровне ограничена блоком, в котором они объявлены. Значение переменной а увеличивается на 2 и становится равным 4. Если бы функция otherбыла вызвана еще раз в той же функции main, то значение а при входе было бы равно 4, а при выходе—6. Внутренние переменные класса памяти staticсохраняют свои значения при входе в блок и выходе из блока, в котором они объявлены. Значение переменной а в функции mainпри этом не изменилось бы.
Переменной в объявлении может быть присвоено начальное значение посредством инициализатора. Записи инициализатора в объявлении предшествует знак равенства
=< инициализатор >
Можно инициализировать переменные любого типа. Функции не инициализируются. Объявления, которые используют спецификацию класса памяти extern, не могут содержать инициализатор.
Переменная, объявленная на внешнем уровне без спецификации класса памяти, может быть инициализирована не более одного раза в каком-либо из исходных файлов, составляющих программу. Если же она явно не инициализирована ни в одном из исходных файлов, то компоновщик инициализирует ее нулевым значением.
Переменная класса памяти static, объявленная как на внешнем, так и на внутреннем уровне, может быть инициализирована константным выражением не более одного раза в исходном файле. Если ее явная инициализация отсутствует, то компилятор языка Си инициализирует ее нулевым значением.
Инициализация переменных класса памяти autoи registerвыполняется каждый раз при входе в блок (за исключением входа в блок по оператору goto), в котором они объявлены. Если инициализатор опущен в объявлении переменной класса памяти autoили register, то ее начальное значение не определено. Инициализация переменных составных типов (массив, структура, объединение), имеющих класс памяти auto, запрещена в СП MSC, но допускается в СП ТС даже для переменных, объявленных с модификатором const. Переменные составного типа, имеющие класс памяти static, могут быть инициализированы на внутреннем уровне.
Инициализирующими значениями для переменных внешнего уровня, а также переменных класса памяти staticвнутреннего уровня должно быть константное выражение (см. раздел 4.2.9). Переменные классов памяти autoи registerмогут быть инициализированы не только константными выражениями, но и выражениями, содержащими переменные и вызовы функций.
Синтаксис:
= < выражение >
Значение выражения присваивается переменной. При необходимости выполняются правила преобразования типов.
Примеры:
int х = 10, у = 20; /* пример 1 */
register int *рх = 0; /* пример 2 */
int с = (3*1024); /* пример 3 */
int *b = &x; /* пример 4 */
В первом примере переменная хинициализируется константным выражением 10, переменная уинициализируется константным выражением 20. Во втором примере указатель рхинициализирован нулевым значением. В третьем примере используется константное выражение для инициализации переменной с. В четвертом примере указатель bинициализируется адресом переменной х.
Элементы объектов составных типов инициализируются только константными выражениями.
Инициализация объектов составных типов имеет следующий синтаксис:
= {< список инициализаторов >}
Список инициализаторов представляет собой последовательность инициализаторов, разделенных запятыми. Список инициализаторов заключается в фигурные скобки. Каждый инициализатор в списке представляет собой либо константное выражение, либо, в свою очередь, список инициализаторов. Таким образом, заключенный в фигурные скобки список может появиться внутри другого списка инициализаторов. Эта конструкция используется для инициализации тех элементов объектов составных типов, которые сами имеют составной тип.
Читать дальше