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

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

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

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

Ответ 1

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

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

Ответ 2

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

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

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

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

Ответ 3

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

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

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

Ответ 4

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