LINUX.ORG.RU

История изменений

Исправление 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. У него будет, соответственно, другое объяснение.