在该示例中,C中的逻辑表达式的短路行为

程序

#include  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.为什么? 因为&&优先于||。 所以我按照以下步骤操作:1)j加1,所以j现在值2 … 2)k加1,所以k现在值2 … 3)2 && 2,计算结果为1 … 4)不需要进一步评估作为||的右操作数 是的,所以整个表达式必须是真的,因为逻辑表达式的短路行为……

为什么我错了?

优先级仅影响分组。 &&的优先级高于|| 手段:

 ++i || ++j && ++k 

相当于:

 ++i || (++j && ++k) 

但这并不意味着首先评估++j && ++k 。 它仍然从左到右评估,并根据||短路规则 , ++i是真的,所以++j && ++k永远不会被评估。