Вполне может быть.... Ещё в копилочку.
В языке С
нет оператора присваивания. Есть assignment expression, присваивающее
выражение, само присваивание есть побочным эффектом вычисления этого выражения :-)
А все побочные эффекты выполняются "когда угодно", лишь бы до следующей "точки следования" (sequence point). Одна из точек следования - это точка с запятой. Т.е.
a = b;
Это
выражение, значением которого является значение "то, что окажется в
a после присваивания".
a = b = 0;
Оба присваивания - "побочные эффекты", которые могут выполниться
в любое время и в любом порядке между двумя точками следования. Так что компилятор имеет право сначала занести 0 в
a, потом в
b (за исключением случая, когда b - volatile).
Тут пока ещё всё нормально :-)
Но как бы классику
a ^= b ^= a ^= b;
лучше не писать, так как тут есть два присваивания
a, для которых не гарантируется порядок.
И в параноидальном режиме (pedantic) какой-то из gcc-ей на такую строку выдал предупреждение :-).