Я выполнил следующий код в Code::Blocks 10.05 в Windows 7.
int a=0,b=0,c;
c=a++&&b++;
printf("\na=%d\nb=%d\nc=%d\n\n",a,b,c);
Результат, который я получил, приведен ниже,
a=1
b=0
c=0
Это имеет смысл из-за оценки короткого замыкания.
Выражение a++
является постинкрементом, а 0
возвращается к логическому и (&&
). Следовательно, часть b++
не оценивается, поскольку и 0 && 0
, и 0 && 1
оцениваются как 0
.
Но здесь возникает мое сомнение. Значение приоритета операторов четко указывает, что ++
имеет более высокий приоритет, чем &&
. Итак, мое понимание было таким: оцениваются как a++
, так и b++, а затем &&
только проверяет результат выражения a++
, чтобы прийти к решению. Но этого не произошло, здесь оценивается только a++
.
В чем причина такого поведения? Имеет ли отношение к такому поведению &&
как точка следования? Если да, то почему мы говорим, что &&
имеет более низкий приоритет, чем ++
?
a++
будет увеличиваться в неопределенное время между моментом оценкиa
и завершением оператора. Вот почему вы не можете снова использоватьa
в одном и том же выражении (до или послеa++
). - person Potatoswatter   schedule 03.08.2015