代码:
#include<stdio.h>
int main()
{
int j = 7, i = 4;
j = j || ++i && printf("you can");
printf("%d %d",i,j);
return 0;
}
输出结果: 4 1
[代码链接][1]
- 前缀运算符的优先级高于逻辑运算符。
2. 逻辑
&&
的优先级高于逻辑||
。 - 在逻辑 AND (
&&
) 中,如果第一个操作数评估为 false,则不会评估第二个操作数;在逻辑 OR (||)
) 中,如果第一个操作数评估为true
,则不会评估第二个操作数。 - 整个表达式评估为
true
,因此 j 为 1。
疑问:
Why the first rule is not followed here? Shouldn't it be correct?
j=(j||((++i) &&printf("you can")));
printf
语句中,i
的值变为5。为什么这里违反了一般的优先级规则?当两个运算符的优先级相同时,结合性就会发挥作用。编译器难道不应该首先确定是计算
||
还是&&
吗?如果首先计算
||
,那么结果是正确的,这是我所知道的。然而,如果它不是首先计算的,那么应该输出51。
j || (++i && printf("you can"))
。由于存在中间序列点,j ||
首先被计算。因此第二部分不会被计算。 - P.P