Является ли эта самоинициализация действительной?
у меня есть этот вопрос, о котором я думал ранее, но понял, что это не тривиально ответить
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
. Таким образом, основной() вернется 1.
код определенно будет работать непредсказуемым образом, если x
- локальная переменная, выделенная в стеке. Состояние стека, в отличие от сегмента данных, в значительной степени гарантированно содержит неопределенный мусор.
переменная 'x' хранится в поле .bss, который заполняется 0s при загрузке программы. Следовательно, значение " x " равно 0, когда программа загружается в память.
затем перед вызовом main выполняется "x = x + 1".
Я не знаю, действительно ли это или нет, но поведение не определено.
перед основным вызовом x должен быть инициализирован до 0, поэтому его значение должно быть 1, которое вы вводите main, и вы вернете 1. Это определенное поведение.