Это равно, потому что это C. Как говорит другой ответ, результат этой операции не определен, потому что вы нарушаете правила C - это означает, что вы не можете гарантировать один и тот же ответ при переключении компиляторов (хотя все компиляторы могут быть реализованы похоже, что не дает гарантии). Тот факт, что С позволяет вам выстрелить себе в ногу, не означает, что это хорошая практика.
Теперь, почему это работает?
Гипотеза № 1:
i
может храниться в регистре, скажем, r1
, и компилятор может компилировать все это сравнение в одну инструкцию CMP с режимом автоинкрементной адресации. Скажем, это CMP ++r1, r1
или CMP r1, ++r1
, тогда, в зависимости от фактического процессора, оба могут возвращать истинное сравнение.
Гипотеза № 2:
Компилятор может компилировать сравнение в:
inc r1 // increment r1
CMP r1, r1 // compare with itself
Гипотеза № 3:
Компилятор может оптимизировать, чтобы всегда размещать простой доступ к переменной с правой стороны. Это разрешено делать, потому что порядок выполнения в операторе ==
не определен, и компилятор может перестраивать вещи по своему усмотрению.