Действительна ли эта самостоятельная инициализация? - PullRequest
64 голосов
/ 22 июля 2010

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

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

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

Ответы [ 4 ]

100 голосов
/ 22 июля 2010

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

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

11 голосов
/ 22 июля 2010

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

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

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

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

6 голосов
/ 22 июля 2010

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

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

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

0 голосов
/ 22 июля 2010

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

...