在折叠代码中,
int a = 1, b = 2, c = 3, d;
d = a++ && b++ || c++;
printf("%d\n", c);输出为3,或者计算第一个条件,将其视为1,然后不关心其他条件,但在c中,一元运算符比逻辑运算符有更高的优先级,在数学中类似。
2 * 3 + 3 * 4我们将通过先求乘积,然后求和来计算上面的表达式,为什么c不这样做呢?首先对所有一元运算符进行评估,然后再对逻辑操作进行评估?
发布于 2018-03-24 11:04:44
请认识到,优先级与评价顺序不同。&&和||的特殊行为表明,如果没有必要的话,就根本不会对右侧进行评估。优先级告诉您,如果对其进行评估,将如何对其进行评估。
换句话说,优先级有助于描述如何解析表达式。但它并没有直接说明如何评估它。优先级告诉我们,解析您询问的表达式的方法是:
||
/ \
/ \
&& c++
/ \
/ \
a++ b++但是,当我们评估这个解析树时,&&和||的短路行为告诉我们,如果左边决定了结果,我们就不会从右边去评估任何东西。在这种情况下,由于a++ && b++是真的,所以||操作符知道它的结果是1,所以它根本不会导致计算c++部分。
这也是为什么条件表达式如
if(p != NULL && *p != '\0')和
if(n == 0 || sum / n == 0)是安全的。第一个不会崩溃,不会尝试访问*p,在p为NULL的情况下。如果n为0,则第二个不除以0。
评价的先后顺序很容易给人留下错误的印象。当我们有一种表达方式
1 + 2 * 3我们总是说“*比+更高的优先级意味着乘法首先发生”。但是,如果我们加入一些函数调用,比如:
f() + g() * h()这三个函数中的哪一个将首先被调用?结果我们不知道。优先并不能告诉我们这一点。编译器可以安排首先调用f(),即使最后需要它的结果。另见this answer。
https://stackoverflow.com/questions/49463906
复制相似问题