Матье и πάντα ῥεῖ верны: это классическое неопределенное поведение.(Одно обоснование для того, чтобы сделать его неопределенным , а не просто неопределенным или реализацией, определенной , заключается в том, что некоторые архитектуры имеют флаги для неинициализированных регистров и могут перехватывать.) Фактически, компиляторможно скомпилировать ее в пустую программу: чтение неинициализированной переменной может привести к что угодно - и ничто является подмножеством что угодно .Весь последующий код после неопределенного поведения «испорчен» предыдущей ошибкой и может быть опущен.Обратите внимание, что разные архитектуры и разные компиляторы, возможно, даже разные стандартные библиотеки C (с одним и тем же компилятором!) Могут давать разные результаты;даже другой флаг компилятора (касающийся соглашений об оптимизации или вызове функций) может изменить это неопределенное поведение.
( Остальная часть этого ответа относится к версии вопроса, где строкапосле цикла прочитайте x++, k++;
(вместо k--
как сейчас). )
Но вы столкнулись с непротиворечивым поведением, и вопрос в том, почему оно непротиворечивое.Первое предположение состоит в том, что компилятор не просто генерирует код для вывода «5» (что он мог, законно), но фактически «наивно» генерирует машинный код, который соответствует операторам C.Мы рассмотрим приведенные ниже утверждения.
Затем поведение указывает, что области памяти, в которых находятся x и k, содержат значения, из-за которых k > x -3
сразу ложно.(В противном случае k будет уменьшаться до тех пор, пока разница не станет 3, а не 5).
Если условие ложно, разница в переменной не изменится;из этого можно сделать вывод, что это было 5 с самого начала с x-k == 5
.Если вы опустите abs()
, выходное значение должно быть -5
.
Причина, по которой переменные имеют эти непротиворечивые начальные значения, может быть связана с действиями операционной системы или среды выполнения C при запуске программы, такими как инициализациястандартные потоки.Попробуйте использовать printf
вместо cout
и посмотрите, изменится ли результат.