#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操作的总体结果为true或1
。但是,由于使用了短路逻辑或,所以第二个括号没有得到评估。
所以,我的问题是,如果括号的优先级高于表达式中的所有其他运算符,为什么不是首先同时计算括号,然后执行OR操作? 也就是说,为什么输出0 0 0 2 1
而不是0 0 0 3 1
?
编辑: 我问是this(建议一式两份)有所不同 因为我在封闭的第二个操作数OR运算括号强调。
请注意,如果第一个括号表达式为真,则短路评估不会消除“(l ++)”*或其副作用*。括号没有什么区别,'(l ++)'和'l ++' –
...一样,第一部分类似:如果'i == 0',那么接下来的两个表达式不会被评估,效果'j ++'和'k ++'不会发生。这是编写代码的危险方式! –
[在C语言中使用++运算符对语句进行短路评估]的可能重复(http://stackoverflow.com/questions/31779410/short-circuit-evaluation-of-a-statement-with-operator-in-c ) –