据我所知逻辑运算符&&
优先级高于||
。运行代码时:
#include <stdio.h>
int main()
{
int i = 1, j =1, k = 1;
printf("%d\n",++i || ++j && ++k);
printf("%d %d %d",i,j,k);
return 0;
}
给出输出:
1
2 1 1
只有当++i || ++j && ++k
评估如下:
(++i) || (++j && ++k)
但是,根据运算符优先规则,它应该被评估为:
(++i || ++j) && (++k)
因此输出应该是:
1
2 1 2
这是怎么回事?
注意:根据我的理解,我认为优先级较高的运算符的评估如下(如果它是左关联的):
1. 评估其左侧表达式
2.然后评估其正确的表达式(如果需要)
我错了吗?
The ||
操作员短路- 如果其第一个操作数的计算结果为真(非零),则它不会计算其第二个操作数。
这也适用于&&
,如果第一个操作数为 false,则不会使用第二个操作数。这是一种可能的优化,因为任何布尔值 OR true 都是 true,同样,任何布尔值 AND false 总是 false。
好的,所以您混淆了优先级和评估顺序。这里一点也不矛盾:
++i || ++j && ++k
被分组为
(++i) || (++j && ++k)
since &&
具有更高的优先级。但是 OR 运算的 LHS 为真,所以整个 RHS它的 AND 运算被丢弃,不会被评估。
对于您在编辑中的注释:是的,您错了:运算符优先级是still与评估顺序不同。这只是分组而已。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)