2013-12-02 2 views
-2

я увидел следующий код в дикой природе, и я не знаю, что сделать из него:Назначение переменных без ссылок?

более или менее:

int main(void) 
{ 
    int a = 0, v; 
    printf("%d\n", v); 
} 

Этот код с GCC напечатает 0. Сначала я хотя , ну, это потому, что инициализированные локальные переменные присваиваются 0, но в этом случае я никогда не объявлял тип v ... так что дает?

+5

* Инициализированные локальные переменные присваиваются 0 * - Нет, у него есть мусор. И тип 'v' -' int'. – Maroun

+4

Тип v - 'int'. И поведение по-прежнему не определено. Значение 'v' равно [* неопределенный *] (http://stackoverflow.com/a/17394924/1322972). – WhozCraig

+1

На моей машине я получаю 1664045150, а не 0. Вы только что получили 0. –

ответ

4
int a = 0, v; 

эквивалентно:

int a = 0; 
int v; 

Так вы сделали объявить тип v, просто не в явном виде. Это int.

В любом случае, значение like all uninitialized local variables, v не гарантировано. Доступ к нему по-прежнему является неопределенным поведением; Вы только что произошло, чтобы получить 0.

1

Как вы думаете, что запятая делает в заявлении декларации?

В C - C99 и C++ инициализатор является необязательной частью декларатора. init-declarator-list является разделенной запятыми последовательностью деклараторов, каждая из которых может иметь дополнительную информацию о типе, или инициализатор, или и то, и другое.

Таким образом, ваше выражение int a = 0, v; объявляет v как int.

1

Тип v: int. Прочтите синтаксис объявления переменной.

Вам просто повезло, что он печатает 0. Значение v - это мусор.

0

From Wiki,

Несколько переменных могут быть объявлены с помощью одного оператора, например:

int anumber, anothernumber, yetanothernumber; 
1

С ISO/IEC 9899: TC2раздел 6.7.8 Семантика

Если объект, который имеет automatic storage duration, не инициализирован явно, its value is indeterminate.
Если объект, который имеет статическую длительность хранения, не инициализируется явно, тогда:
- если он имеет тип указателя, он инициализируется нулевым указателем;
- если он имеет арифметический тип, он инициализируется нулем (положительным или без знака);
- если это совокупность, каждый член инициализируется (рекурсивно) в соответствии с этими правилами;
- если это объединение, первый именованный элемент инициализируется (рекурсивно) в соответствии с этими правилами .

Смежные вопросы