PROGRAM
#include <stdio.h>
int main(void)
{
int i, j, k;
i = 1; j = 1; k = 1;
printf("%d ", ++i || ++j && ++k);
printf("%d %d %d", i, j, k);
return 0;
}
观察
1 2 1 1
我期待1 1 2 2.为什么?因为&amp;&amp;优先于||。所以我按照以下步骤操作: 1)j加1,所以j现在值2 ... 2)k加1,所以k现在值2 ... 3)2&amp;&amp; 2,评估为1 ... 4)无需进一步评估作为||的右操作数是的,所以整个表达式必须是真的,因为逻辑表达式的短路行为......
为什么我错了?
答案 0 :(得分:9)
优先级仅影响分组。 &&
的优先级高于||
的含义:
++i || ++j && ++k
相当于:
++i || (++j && ++k)
但这并不意味着首先评估++j && ++k
。它仍然从左到右进行评估,根据||
的短路规则,++i
为真,因此永远不会评估++j && ++k
。