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


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

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

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

4 64

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