Это самоинициализация действительна?

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

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. Это определенное поведение.

Другие вопросы по тегам