Действительно ли эта инициализация является действительной?
У меня есть этот вопрос, о котором я думал раньше, но решил, что это не тривиально ответить
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. Это определенное поведение.