В первую очередь вам нужно сосредоточиться на свойствах операторов префикса и постфикса и их различий.
Для Postfix инкремента и декремента, C11
, глава §6.5.2.4, (курсив мой )
Результат оператора постфикса ++
это значение операнда. В качестве побочного эффекта значение объекта операнда увеличивается [...] Оператор postfix --
аналогичен оператору postfix ++
, за исключением того, что значение операнд уменьшается.
Для префиксных инкремента и декремента, C11
, глава §6.5.3.1, (курсив мой )
Значение операнда оператора префикса ++
увеличивается. В результате получается новое значение 0ABоперанда после инкремента. [...] Оператор префикса --
аналогичен оператору префикса ++
, за исключением того, что значение операнда уменьшено.
Теперь приходит свойство логического И (&&
) оператора. Из главы §6.5.13 (снова, курсив мой)
в &&
оператор гарантирует слева направо оценки; , если второй операнд оценивается, имеется точка последовательности между оценками первого и второго операндов. Если первый операнд сравнивается с 0, второй операнд не оценивается. [...]
Таким образом, в вашем случае,
int a = 1, b = 1, c = -1;
c = --a && b++;
получает оценку, как
c = 0 && .....; // done..., a is decremented to 0,
// so, LHS of && is 0, RHS is not evaluated,
// b remains 1
// and finally, C gets 0.
С другой стороны, если логическое ИЛИ (||
) были бы использованы , то, согласно собственности, упомянутой в главе 6.5.14.
[...] оператор ||
гарантирует оценку слева направо; если вычисляется второй операнд , то существует точка последовательности между оценками первого и вторыми операндами. Если первый операнд сравнивается с не равным 0, второй операнд не оценивается.
Таким образом, для случая
int a = 1, b = 1, c = -1;
c = --a || b++;
будет оцениваться как
c = 0 || 1; //yes, b's value will be used, and then incremented.
Итак,
printf("%d %d %d", a, b, c);
будет
0 2 1
Узнайте о свойствах оператора pre и post in/decament. –
Прежде чем добавить ответ, обратите внимание на то, что '--a && b ++' коротких замыканий. – Schwern