gcc 4.9 при уровне оптимизаций -O2
оставляет только пустой цикл:
.L2:
jmp .L2
и говорит: warning: iteration 715827882u invokes undefined behavior
. Разберем почему.
Понятно, что компилятору все равно, что там в каждой из трех частей записано. Главное, чтобы оно выполнялось и второе выражение возвращало результат, который можно было бы проверить на истину/ложь.
Поэтому, в каждой итерации цикла, переменная x будет увеличиться на 3 (первый раз третьим выражением, потом телом цикла и третий раз - вторым выражением в for).
Умножив 715827882 на 3 и переведя в hex, получим 0x7FFFFFFE - то есть почти максимальное положительное число, которое можно записать в 32-битную переменную. Следующая итерация привет уже к отрицательному числу в x. Теоретически, увеличивая дальше это отрицательное число, можно прийти к нулю.
Но на самом деле компилятор видит, что переменная x
увеличивается, а переменная, которая была равна нулю и постоянно увеличивается, не может быть равна нулю. Поэтому тело цикла и будет исполнятся "бесконечно" при данной оптимизации.
Итого. Какой же правильный ответ?
Если рассчитывают на то, что компилятор туп, и нужно аккуратно пройти через переполнение, то ответ прост. Это 0xFFFFFFFF / 3 = 1431655765. (при условии, что int - 32 битный).
Если у компилятора 16-битный int (старый турбо си), то ответ будет, скорее всего, 21845.
Но, возможно, что int длиной 64бита...
Но вышеприведенные ответы правильны, если компилятор не сделал оптимизаций. Если он сделал, то правильный ответ никогда не будет выведен, так как там бесконечный цикл.
Если бы меня спросили подобное на собеседовании, то я спросил бы: "А у вас тут такой код пишут?". В случае позитивного ответа, я бы встал и пошел на выход. Потому что лучше не вмешиваться в подобное. Если люди вменяемые, то они остановят и извинятся.