在下面的代码中,
int a = 1, b = 2, c = 3, d;
d = a++ && b++ || c++;
printf("%d\n", c);
输出将为 3,我得到它或评估第一个条件,将其视为 1,然后不关心其他条件,但在 c 中,一元运算符比逻辑运算符具有更高的优先级,就像在数学中一样
2 * 3 + 3 * 4
我们将通过首先计算乘积然后求和来计算上面的表达式,为什么 c 不这样做呢?首先评估所有一元运算符,然后评估逻辑是什么?
请认识到优先级与以下概念不同评估顺序。的特殊行为&&
and ||
表示如果不需要,则根本不会评估右侧。优先级告诉您如果对其进行求值,将如何对其进行求值。
换句话说,优先级有助于描述如何解析表达式。但并没有直接说如何评价。优先级告诉我们解析您询问的表达式的方法是:
||
/ \
/ \
&& c++
/ \
/ \
a++ b++
但是当我们去评估这个解析树时,&&
and ||
告诉我们,如果左侧决定结果,我们就不会沿着右侧进行评估。在这种情况下,由于a++ && b++
是真的,||
运算符知道其结果将为 1,因此不会导致c++
完全需要评估的部分。
这也是为什么条件表达式像
if(p != NULL && *p != '\0')
and
if(n == 0 || sum / n == 0)
是安全的。第一个不会崩溃,不会尝试访问*p
,在这种情况下p
一片空白。第二个不会被 0 除,如果n
is 0.
人们很容易对求值的优先级和顺序产生错误的印象。当我们有这样的表达
1 + 2 * 3
我们总是说“更高的优先级*
over +
意味着乘法首先发生”。但是如果我们添加一些函数调用会怎样,如下所示:
f() + g() * h()
这三个函数中的哪一个将首先被调用?事实证明我们不知道。优先级并没有告诉我们这一点。编译器可以安排调用f()
首先,尽管最后需要其结果。也可以看看这个答案 https://stackoverflow.com/questions/31087537/why-does-a-b-have-the-same-behavior-as-a-b/31088592#31088592.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)