C 运算符优先级,a++ && b++ || 中的逻辑运算符与一元运算符++c

2024-02-06

在下面的代码中,

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(使用前将#替换为@)

C 运算符优先级,a++ && b++ || 中的逻辑运算符与一元运算符++c 的相关文章

随机推荐