netlib.narod.ru< Назад | Оглавление | Далее >

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

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

При отсутствии явной инициализации для внешних и статических переменных гарантируется их обнуление; автоматические и регистровые переменные имеют неопределенные начальные значения («мусор»).

Скалярные переменные можно инициализировать в их определениях, помещая после имени знак = и соответствующее выражение:

    int x = 1;
    char squote = '\'';
    long day = 1000L * 60L * 60L * 24L; /* день в миллисекундах */

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

    int binsearch(int x, int v[], int n)
    {
      int low = 0;
      int high = n - 1;
      int mid;
      ...
    }

вместо

    int low, high, mid;
    
    low = 0;
    high = n - 1;

В сущности, инициализация автоматической переменной — это более короткая запись инструкции присваивания. Какая запись предпочтительней — в большой степени дело вкуса. До сих пор мы пользовались главным образом явными присваиваниями, поскольку инициализация в объявлениях менее заметна и дальше отстоит от места использования переменной.

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

    int days[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

Если размер массива не указан, то длину массива компилятор вычисляет по числу заданных инициализаторов; в нашем случае их количество равно 12.

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

Инициализация символьных массивов — особый случай: вместо конструкции с фигурными скобками и запятыми можно использовать строку символов. Например, возможна такая запись:

    char pattern[] = "ould";

представляющая собой более короткий эквивалент записи

    char pattern[] = {'o', 'u', 'l', 'd', '\0'};

В данном случае размер массива равен пяти (четыре обычных символа и завершающий символ '\0').


netlib.narod.ru< Назад | Оглавление | Далее >

Сайт управляется системой uCoz