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