Язык С




Инициализация


Мы до сих пор уже много раз упоминали инициализацию, но всегда мимоходом , среди других вопросов. Теперь, после того как мы обсудили различные классы памяти, мы в этом разделе просуммируем некоторые правила, относящиеся к инициализации. Если явная инициализация отсутствует, то внешним и ста- тическим переменным присваивается значение нуль; автомати- ческие и регистровые переменные имеют в этом случае неопре- деленные значения (мусор).

Простые переменные (не массивы или структуры) можно ини- циализировать при их описании, добавляя вслед за именем знак равенства и константное выражение:

INT X = 1; CHAR SQUOTE = '\''; LONG DAY = 60 * 24; /* MINUTES IN A DAY */

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

BINARY(X, V, N) INT X, V[], N; { INT LOW = 0; INT HIGH = N - 1; INT MID; ... }

вместо

BINARY(X, V, N) INT X, V[], N; { INT LOW, HIGH, MID;

LOW = 0; HIGH = N - 1; ... }

По своему результату, инициализации автоматических перемен- ных являются сокращенной записью операторов присваивания. Какую форму предпочесть - в основном дело вкуса. мы обычно используем явные присваивания, потому что инициализация в описаниях менее заметна. Автоматические массивы не могут быть инициализированы. Внеш- ние и статические массивы можно инициализировать, помещая вслед за описанием заключенный в фигурные скобки список на- чальных значений, разделенных запятыми. Например программа подсчета символов из главы 1, которая начиналась с MAIN() /* COUNT DIGITS, WHITE SPACE, OTHERS */ ( INT C, I, NWHITE, NOTHER; INT NDIGIT[10];




Содержание  Назад  Вперед