Вопрос

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top