[英]How does operator precedence actually work in this program?
#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
?
编辑 :我所要问的与此 (建议重复项)有所不同,因为我强调的是包围OR运算符第二个操作数的括号。
存在歧义时,运算符优先级将生效。
在这种情况下,规格非常明确。
||
如果运算符的两个操作数都不等于0
,则运算符将产生1
; 否则,得出0
。 结果的类型为int
。
并且,( 重点是我的 )
不像按位
|
运算符,||
运营商保证从左到右的评估; 如果对第二个操作数求值,则在第一个和第二个操作数的求值之间有一个序列点。 如果第一个操作数比较不等于0
,则不计算第二个操作数。
就你而言
(i++ && j++ && k++) || (l++);
(i++ && j++ && k++)
是左操作数,而(l++);
是正确的操作数,其余的应该很清楚。 :)
运算符优先级(和关联性)仅决定如何解析表达式。 将其与操作数的求值顺序混淆是一个常见的错误,这是另一回事。 在此示例中,运算符优先级无关紧要。
对于大多数使用C的运算符,未指定操作数的求值顺序。 你写的true | l++
吗? true | l++
然后l++
将被执行。 “短路评估”是您的代码中未发生这种情况的原因。 && ||
运算符是一种特殊情况,因为它们明确定义了评估顺序。 ||
的右操作数 如果左操作数的计算结果为非零,则保证不会进行计算。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.