Поделиться через


Инициализация скалярных типов

При инициализации скалярных типов значение assignment-expression переменной назначается переменной. Применяются правила преобразования для назначения. (Сведения о правилах преобразования см. в разделе "Преобразования типов ".)

Синтаксис

declaration:
declaration-specifiers init-declarator-list выбирать;

declaration-specifiers:
storage-class-specifier declaration-specifiers выбирать
type-specifier declaration-specifiers выбирать
type-qualifier declaration-specifiers выбирать

init-declarator-list:
init-declarator
init-declarator-list , init-declarator

init-declarator:
declarator
declarator = initializer /* Для скалярной инициализации */

initializer:
assignment-expression

Вы можете инициализировать переменные любого типа, если соблюдать следующие правила:

  • Переменные, объявленные на уровне области файла, можно инициализировать. Если вы явно не инициализируете переменную на внешнем уровне, она инициализирована до 0 по умолчанию.

  • Константное выражение можно использовать для инициализации любой глобальной переменной, объявленной с помощью .staticstorage-class-specifier Переменные, объявленные как static инициализированные при начале выполнения программы. Если вы явно не инициализируете глобальную static переменную, она инициализирована до 0 по умолчанию, и каждый элемент с типом указателя назначается пустым указателем.

  • Переменные, объявленные с auto помощью описателя класса хранилища, register инициализированы каждый раз, когда элемент управления выполнением передается в блок, в котором они объявлены. Если опущен инициализатор из объявления или auto переменнойregister, начальное значение переменной не определено. Для автоматических и регистрирующих значений инициализатор не ограничивается константой; это может быть любое выражение, включающее ранее определенные значения, даже вызовы функций.

  • Начальные значения для объявлений внешних переменных и для всех static переменных, будь то внешние или внутренние, должны быть константными выражениями. Дополнительные сведения см. в разделе "Константные выражения". Так как адрес любой внешней объявленной или статической переменной является константой, ее можно использовать для инициализации внутренне объявленной static переменной указателя. Однако адрес переменной auto нельзя использовать в качестве статического инициализатора, так как он может отличаться для каждого выполнения блока. Для инициализации auto и register переменных можно использовать константы или переменные.

  • Если объявление идентификатора имеет область блокировки, а идентификатор имеет внешнюю компоновку, объявление не может иметь инициализацию.

Примеры

В следующих примерах иллюстрируются инициализации:

int x = 10;

Целочисленная переменная x инициализирована в константное выражение 10.

register int *px = 0;

Указатель px инициализируется до 0, создавая указатель null.

const int c = (3 * 1024);

В этом примере используется константное выражение (3 * 1024) для инициализации c в константное значение, которое невозможно изменить из-за ключевого const слова.

int *b = &x;

Эта инструкция инициализирует указатель b с адресом другой переменной. x

int *const a = &z;

Указатель a инициализируется адресом переменной с именем z. Тем не менее, так как она указана const, переменная a может быть инициализирована только инициализирована, никогда не изменяя. Он всегда указывает на то же расположение.

int GLOBAL ;

int function( void )
{
    int LOCAL ;
    static int *lp = &LOCAL;   /* Illegal initialization */
    static int *gp = &GLOBAL;  /* Legal initialization   */
    register int *rp = &LOCAL; /* Legal initialization   */
}

Глобальная переменная GLOBAL объявлена на внешнем уровне, поэтому она имеет глобальное время существования. Локальная переменная имеет LOCAL класс хранилища и имеет адрес только во время выполнения функцииauto, в которой она объявлена. Поэтому попытка инициализировать static переменную lp указателя с адресом LOCAL не разрешена. Переменная staticgp указателя может быть инициализирована в адрес, так как этот адрес GLOBAL всегда совпадает. Аналогичным образом можно инициализировать, *rp так как rp это локальная переменная и может иметь инициализатор неконстант. Каждый раз при вводе LOCAL блока имеет новый адрес, которому затем назначается rp.

См. также

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