程序
#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;
}
Run Code Online (Sandbox Code Playgroud)
结果
1 2 1 1
Run Code Online (Sandbox Code Playgroud)
我期待1 1 2 2.为什么?因为&&优先于||.所以我按照这些步骤:1)j加1,所以j现在值2 ... 2)k加1,所以k现在值2 ... 3)2 && 2,评估为1 ... 4)不需要进一步评估作为||的右操作数 是的,所以整个表达式必须是真的,因为逻辑表达式的短路行为......
为什么我错了?
Yu *_*Hao 10
优先级仅影响分组.&&优先级高于||手段:
++i || ++j && ++k
Run Code Online (Sandbox Code Playgroud)
相当于:
++i || (++j && ++k)
Run Code Online (Sandbox Code Playgroud)
但这并不意味着++j && ++k首先进行评估.它仍然从左到右进行评估,根据短路规则||,++i是真的,所以++j && ++k永远不会评估.