Допустима ли эта самоинициализация?
-
27-09-2020 - |
Вопрос
У меня есть этот вопрос, о котором я думал ранее, но решил, что ответить на него нетривиально
int x = x + 1;
int main() {
return x;
}
Мой вопрос заключается в том, определено ли поведение программы или не определено, если оно вообще допустимо.Если оно определено, то является ли значение x
известный в main
?
Решение
Я почти уверен, что это определено, и x должно иметь значение 1.В §3.6.2/1 говорится:"Объекты со статическим сроком хранения (3.7.1) должны быть инициализированы нулем (8.5) до того, как произойдет любая другая инициализация".
После этого, я думаю, все становится довольно просто.
Другие советы
Мой вопрос заключается в том, определено ли поведение программы или не определено, если оно вообще допустимо.Если это определено, известно ли значение x в main?
Этот код определенно не является чистым, но, на мой взгляд, он должен работать предсказуемо.
int x
помещает переменную в сегмент данных, который при запуске программы определен равным нулю.До main()
, вызываются статические инициализаторы.Для x
это и есть код x = x + 1
. x = 0 + 1 = 1
.Таким образом, функция main() вернет 1.
Код определенно работал бы непредсказуемым образом, если бы x
это локальная переменная, размещенная в стеке.Состояние стека, в отличие от сегмента данных, в значительной степени гарантированно содержит неопределенный мусор.
Переменная 'x' хранится в файле .bss, который заполняется 0 при загрузке программы.Следовательно, значение 'x' равно 0, когда программа загружается в память.
Затем, прежде чем будет вызван main, выполняется "x = x + 1".
Я не знаю, допустимо это или нет, но поведение не является неопределенным.
Перед вызовом main x должен быть инициализирован значением 0, поэтому его значение должно быть равно 1, которое вы вводите в main, и вы вернете 1.Это определенное поведение.