История изменений
Исправление slovazap, (текущая версия) :
Я уже объяснил два раза, могу только повторить третий. Мозгов вам прибавить чтобы вы поняли, я увы, не могу.
1) Компилятор при оптимизации исходит из того что UB не случается. Это понятно?
2) Если исходить из того что UB не случается, значит знакового переполнения x не происходит. Это понятно?
3) Если исходить из того что знакового переполнения x не проиходит, значит 3-я итерация цикла не выполнится, потому что её выполнение неизбежно приведёт к переполнению, а значит к UB. Это понятно? Всё сказанное до сих пор вам написал сам компилятор в варнинге, если не верите. Далее оптимизатор считает что цикл не может выполниться более двух раз, точка.
4) В предположении что цикл выполнится не более двух раз, условие y < 7 всегда истинно. Это понятно?
5) Всегда истинное условие оптимизатор имеет полное право выкинуть и выкидывает. Это понятно?
Имеем бесконечный цикл. Остального когда оптимизации не коснулись, получилось что получилось - y растёт, x колбасится.
И да, на разных компиляторах, версиях, архитектурах и опциях может быть любое другое поведение, потому что оптимизаторы разные или работают по-разному, на то UB и UB. У него будет, соответственно, другое объяснение.
Исходная версия slovazap, :
Я уже объяснил два раза, могу только повторить третий. Мозгов вам прибавить чтобы вы поняли, я увы, не могу.
1) Компилятор при оптимизации исходит из того что UB не случается. Это понятно?
2) Если исходить из того что UB не случается, значит знакового переполнения x не происходит. Это понятно?
3) Если исходить из того что знакового переполнения x не проиходит, значит 3-я итерация цикла не выполнится, потому что её выполнение неизбежно приведёт к переполнению, а значит к UB. Это понятно? Всё сказанное до сих пор вам написал сам компилятор в варнинге, если не верите. Далее оптимизатор считает что цикл не может выполниться более двух раз, точка.
4) В предположении что цикл выполнится не более двух раз, условие y < 7 всегда истинно. Это понятно?
5) Всегда истинное условие оптимизатор имеет полное право выкинуть и выкидывает. Это понятно?
Имеем бесконечный цикл.
И да, на разных компиляторах, версиях, архитектурах и опциях может быть любое другое поведение, потому что оптимизаторы разные или работают по-разному, на то UB и UB. У него будет, соответственно, другое объяснение.