【发布时间】:2017-03-11 07:56:04
【问题描述】:
#include<stdio.h>
int main()
{
int i=-1, j=-1, k=-1, l=2, m;
m = (i++ && j++ && k++) || (l++);
printf("%d %d %d %d %d", i, j, k, l, m);
}
我对在给定程序中评估逻辑表达式时运算符优先级的工作方式感到困惑。
变量m 将被分配0 或1,具体取决于它后面的逻辑表达式的值。
将评估第一个括号,两个 AND 运算的总体结果将为真或1。但是,由于使用了短路逻辑 OR,因此不会对第二个括号进行评估。
所以,我的问题是,如果括号的优先级高于该表达式中的所有其他运算符,为什么不先评估两个括号,然后执行 OR 操作?
也就是为什么输出的是0 0 0 2 1而不是0 0 0 3 1?
编辑: 我所问的与this 有所不同(建议重复) 因为我强调括号括住 OR 运算符的第二个操作数。
【问题讨论】:
-
请注意,如果第一个带括号的表达式为真,短路评估将不会评估
(l++)或其副作用。括号没有区别,(l++)与l++完全相同 -
...与第一部分类似:如果
i == 0则不计算接下来的两个表达式,并且不会发生大小效应j++和k++。这是一种危险的代码编写方式! -
@BoPersson:不完全是重复的,但上述问题的答案之一也有帮助:stackoverflow.com/a/31779475/1866196
标签: c logical-operators operator-precedence short-circuiting logical-or