混合使用逻辑运算符和自增运算符

3

我有一个问题,涉及逻辑运算符的前缀和后缀增量。如果我有以下代码:

void main()
{int i = - 3 , j = 2 , k = 0 , m ;
m=++i||++j&&++k;
printf("%d %d %d %d",i,j,k,m);}

了解到增量和减量运算符的优先级高于&&和||,因此它们将首先执行。然后&&优先级较高,这意味着-2||3&&1的值为-2 3 1 1,用printf输出。

但是在VS2010上尝试时,我得到的输出是-2 2 0 1。

有人能对此进行解释吗?谢谢。


请注意,运算符优先级不一定等同于执行顺序。除了优先级之外,重要的是“评估顺序”,在&&||运算符的特定情况下已经定义明确。 - Lundin
1个回答

4

当出现短路时,你会得到这个结果。 ++i 是-2,其余部分不需要被评估(并且根据标准也不会)。 || 的左侧为真,因为-2不是0,所以整个表达式为真。


“&&” 不比 “||” 的优先级高吗? 我的意思是,例如乘法和加法,在乘法中乘法的优先级高于加法,因此如果我们检查 3+4*5,它将是 23 而不是 35。 或者我错过了什么吗? 无论如何,感谢克里斯的极快回复 :) - user2268349
5
之所以会发生这种情况,是因为它具有更高的优先级。整个表达式可以写作(++i) || (++j&&++k)。由于左侧为真,右侧不会被评估。如果||的优先级更高,则必须评估++i||++j以确定是否还需要评估++k - chris
谢谢 Chris,我明白了。 - user2268349

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接