Описатель может указывать начальное значение описываемо-го идентификатора. Инициализатор состоит из выражения илизаключенного в фигурные скобки списка значений, перед кото-рыми ставится знак =. Инициализатор: = выражение = \(список-инициализатора\) = \(список-инициализатора,\) список-инициализатора: выражение список-инициализатора,список-инициализатора \(список-инициализатора\) Все выражения, входящие в инициализатор статической иливнешней переменной, должны быть либо константными выражения-ми, описываемыми в п. 23, Либо выражениями, которые сводятсяк адресу ранее описанной переменной, возможно смещенному наконстантное выражение. Автоматические и регистровые перемен-ные могут быть инициализированы произвольными выражениями,включающими константы и ранее описанные переменные и функ-ции. Гарантируется, что неинициализированные статические ивнешние переменные получают в качестве начальных значений0;неинициализированные автоматические и регистровые перемен-ные в качестве начальных значений содержат мусор. Когда инициализатор применяется к скаляру (указателю илиобъекту арифметического типа), то он состоит из одного выра-жения, возможно заключенного в фигурные скобки. Начальноезначение объекта находится из выражения; выполняются те жесамые преобразования, что и при присваивании. Когда описываемая переменная является агрегатом (струк-турой или массивом ), то инициализатор состоит из заключен-ного в фигурные скобки и разделенного запятыми списка иници-ализаторов для членов агрегата. Этот список составляется впорядке возрастания индекса или в соответствии с порядкомчленов. Если агрегат содержит подагрегаты, то это правилоприменяется рекурсивно к членам агрегата. Если количествоинициализаторов в списке оказывается меньше числа членов аг-регата, то оставшиеся члены агрегата заполняются нулями.Запрещается инициализировать объединения или автоматическиеагрегаты. Фигурные скобки могут быть опущены следующим образом.Если инициализатор начинается с левой фигурной скобки, топоследующий разделенный запятыми список инициализаторов ини-циализирует члены агрегата; будет ошибкой, если в спискеокажется больше инициализаторов, чем членов агрегата. Еслиоднако инициализатор не начинается с левой фигурной скобки,то из списка берется только нужное для членов данного агре-гата число элементов; оставшиеся элементы используются дляинициализации следующего члена агрегата, частью которого яв-ляется настоящий агрегат. Последнее сокращение допускает возможность инициализациимассива типа CHAR с помощью строки. В этом случае члены мас-сива последовательно инициализируются символами строки. Например, INT X[] = \(1,3,5\); описывает и инициализирует X как одномерный массив; посколь-ку размер массива не специфицирован, а список инициализиторасодержит три элемента, считается, что массив состоит из трехчленов. Вот пример инициализации с полным использованием фигур-ных скобок: FLOAT *Y[4][3] = \( ( 1, 3, 5 ), ( 2, 4, 6 ), ( 3, 5, 7 ), \); Здесь 1, 3 и 5 инициализируют первую строку массива Y[0], аименно Y[0][0], Y[0][1] и Y[0][2]. Аналогичным образом сле-дующие две строчки инициализируют Y[1] и Y[2]. Инициализаторзаканчивается преждевременно, и, следовательно массив Y[3]инициализируется нулями. В точности такого же эффекта можнобыло бы достичь, написав FLOAT Y[4][3] = \( 1, 3, 5, 2, 4, 6, 3, 5, 7 \); Инициализатор для Y начинается с левой фигурной скобки, ноинициализатора для Y[0] нет. Поэтому используется 3 элементаиз списка. Аналогично следующие три элемента используютсяпоследовательно для Y[1] и Y[2]. следующее описание FLOAT Y[4][3] = \( (1), (2), (3), (4) \); инициализирует первый столбец Y (если его рассматривать какдвумерный массив), а остальные элементы заполняются нулями. И наконец, описание CHAR MSG[] = "SYNTAX ERROR ON LINE %S\N"; демонстрирует инициализацию элементов символьного массива спомощью строки.