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

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

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