Поведение программы на C, которая выполняет выражение i == (i = 2)
, равно undefined .
Оно происходит от C11 6.5p22 :
Если побочный эффект на скалярный объект не секвенирован относительно другого побочного эффекта на тот же скалярный объект или вычисления значения с использованием значения того же скалярного объекта, поведение не определено.Если имеется несколько допустимых порядков подвыражений выражения, поведение не определено, если такой беспорядочный побочный эффект возникает в любом из порядков.84)
i
наЛевая часть ==
является вычислением значения для скалярного объекта i
, а правая часть i = 2
имеет побочный эффект от присвоения значения 2
i
.LHS и RHS ==
не связаны друг с другом.Следовательно, вся программа не имеет смысла в C.
Скомпилируйте с gcc -Wall
, и GCC выдаст:
unsequenced.c:5:16: warning: operation on ‘i’ may be undefined [-Wsequence-point]
if(i == (i = 2)) {
~~~^~~~
В отличие от C, Java гарантирует порядок оценки для операндов (слева направо), поэтому
haveNext = (prev == (prev = get()));
является правильным в Java.Значение LHS определяется строго до того, как произойдет оценка побочного эффекта на RHS.
В C у вас есть , чтобы написать это как что-то вроде
newPrev = get();
haveNext = (prev == newPrev);
prev = newPrev;