Это сам допустимая инициализация?

У меня есть этот вопрос, о котором я думал ранее, но полагал, что это не тривиально для ответа

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

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

64
задан Johannes Schaub - litb 28 August 2012 в 18:51
поделиться

4 ответа

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

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

100
ответ дан 24 November 2019 в 15:52
поделиться

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

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

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

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

11
ответ дан 24 November 2019 в 15:52
поделиться

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

Затем перед вызовом main выполняется "x = x + 1".

Я не знаю, корректно это или нет, но поведение не является неопределенным.

6
ответ дан 24 November 2019 в 15:52
поделиться

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

0
ответ дан 24 November 2019 в 15:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: