2010-07-22 4 views
63

У меня есть этот вопрос, который я думал о ранее, но полагал, что это не тривиальный ответитьЯвляется ли эта самоинициализация действительной?

int x = x + 1; 
int main() { 
    return x; 
} 

Мой вопрос определяется ли поведение программы или неопределенным, если она действует на всех. Если оно определено, значение x известно в main?

+0

Интересно. По крайней мере GCC дает 1, даже с '-std = C++ 98 -pedantic'. – Philipp

+0

Компиляция этого с MSVC9 (15.00.30729.01) дает 1. – akira

+0

Пункт последовательности появляется на виду http://en.wikipedia.org/wiki/Sequence_point – 2010-07-22 13:39:32

ответ

98

Я уверен, что он определен, а x должен иметь значение 1. В разделе 3.3.6/1 говорится: «Объекты со статической продолжительностью хранения (3.7.1) должны быть инициализированы нулями (8.5) перед любым другим инициализация ».

После этого я думаю, что все это довольно просто.

+10

+1 и для цитаты ответа сильного стандарта. –

+12

Хм, удивительный, как тонкий, но важный, «прежде чем произойдет любая другая инициализация». является. – GManNickG

+4

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

6

Переменная 'x' хранится в .bss, которая заполняется 0s при загрузке программы. Следовательно, значение «x» равно 0, когда программа загружается в память.

Затем, прежде чем main вызывается, выполняется «x = x + 1».

Я не знаю, действительно ли это или нет, но поведение не определено.

11

Вопрос в том, определено или не определено поведение программы, если оно действительно вообще. Если оно определено, значение x известно в основном?

Этот код определенно не чист, но для меня он должен работать предсказуемо.

int x помещает переменную в сегмент данных, который определяется при нулевом запуске программы. До main() вызываются статические инициализаторы. Для x - код x = x + 1. x = 0 + 1 = 1. Таким образом, main() вернется 1.

Код определенно работает непредсказуемым образом, если x - это локальная переменная, выделенная на стеке. Состояние стека, в отличие от сегмента данных, в значительной степени гарантировано содержит неопределенный мусор.

0

Перед тем, как главный вызов x должен быть инициализирован равным 0, поэтому это значение должно быть 1, которое вы вводите main, и вы вернетесь 1. Это определенное поведение.

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