在该示例中,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
永远不会被评估。