У меня есть этот вопрос, о котором я думал ранее, но полагал, что это не тривиально для ответа
int x = x + 1;
int main() {
return x;
}
Мой вопрос состоит в том, определяется ли поведение программы или не определено, если это допустимо вообще. Если это определяется, значение x
известный в main
?
Я почти уверен, что он определен, и x должен иметь значение 1. В §3.6.2 / 1 говорится: «Объекты со статической продолжительностью хранения (3.7.1) должны быть инициализированы нулем. (8.5) до любой другой инициализации. "
После этого, я думаю, все довольно просто.
Мой вопрос заключается в том, определено ли поведение программы или не определено, если оно вообще допустимо. . Если он определен, известно ли значение x в main?
Этот код определенно не чистый, но для меня он должен работать предсказуемо.
int x
помещает переменную в сегмент данных, который определен равным нулю при запуске программы. Перед main ()
вызываются статические инициализаторы. Для x
это код x = x + 1
. х = 0 + 1 = 1
. Таким образом, main () вернет 1.
Код определенно будет работать непредсказуемым образом, если x
является локальной переменной, размещенной в стеке. Состояние стека, в отличие от сегмента данных, практически гарантированно содержит неопределенный мусор.
Переменная 'x' хранится в .bss, который заполняется 0-ми при загрузке программы. Следовательно, значение 'x' равно 0, когда программа загружается в память.
Затем перед вызовом main выполняется "x = x + 1".
Я не знаю, корректно это или нет, но поведение не является неопределенным.
Перед основным вызовом x должен быть инициализирован равным 0, поэтому его значение должно быть 1, вы вводите main, и вы вернете 1. Это определенное поведение.