Я собирался прокомментировать @Doug Currie, что целочисленное переполнение со знаком было слишком далеко, хотя технически правильный как ответ.Наоборот!
Подумав еще раз, я думаю, что ответ Дуга не только правильный, но предполагается, что не совсем тривиальный трехслойный, как в примере (но программа с, возможно, циклом или чем-то подобным) должна бытьраспространено на четкое, определенное «да».Вот почему:
Компилятор видит int i = 1, j = 2;
, поэтому знает , что ++ i будет равен j
и, следовательно, не может быть больше j
или даже ++j
.Современные оптимизаторы видят такие тривиальные вещи.
Если, конечно, один из них не переполнен.Но оптимизатор знает, что это будет UB, и поэтому предполагает, что и оптимизирует в соответствии с , этого никогда не произойдет .
Таким образом, условие троичного оператора всегда ложно (в этом простомпример, конечно, но даже если его несколько раз вызывать в цикле, это будет иметь место!), и i
будет увеличиваться только один раз , тогда как j
всегда будет увеличиваться в два раза .Таким образом, j
не только всегда больше, чем i
, но даже выигрывает на каждой итерации (пока не произойдет переполнение, но это никогда не произойдет в нашем предположении).
Таким образом, оптимизаторразрешено превратить это в ++i; j += 2;
безоговорочно, что, безусловно, не то, что можно было бы ожидать.
То же самое относится, например, к циклу с unknown значениями i
и j
, например, предоставленный пользователем ввод.Оптимизатор может очень хорошо признать, что последовательность операций зависит только от начальных значений i
и j
.Таким образом, последовательность приращений, сопровождаемых условным перемещением, может быть оптимизирована путем дублирования цикла, по одному разу для каждого случая, и переключения между ними одним if(i>j)
.И затем, пока мы на нем, он может свернуть цикл повторяющихся приращений на два в нечто вроде (j-i)<<1
, которое он просто добавляет.Или что-то в этом роде.
В предположении, что переполнения никогда не произойдет - это предположение, что оптимизатору разрешено делать, а делает - такое изменение, которое может полностью изменить весь смысл и режим.работы программы совершенно нормально.
Попробуйте и отладьте это.