C运算符优先级,a ++&&amp ;;中的逻辑vs一元b ++ || ++ç

时间:2018-03-24 11:02:40

标签: c operator-precedence

在下面的代码中,

int a = 1, b = 2, c = 3, d;
d = a++ && b++ || c++;
printf("%d\n", c);

输出将为3,我得到或评估第一个条件,将其视为1,然后不关心其他条件,但在c中,一元运算符的优先级高于逻辑运算符,类似于数学运算符

2 * 3 + 3 * 4

我们首先评估产品然后总结来评估上述表达式,为什么不做同样的事情?首先评估所有一元运算符,然后是逻辑事物?

1 个答案:

答案 0 :(得分:6)

请注意优先级评估顺序的概念不同。 &&||的特殊行为表示,如果不必对右侧进行评估,则根本不对其进行评估。优先级会告诉您如何评估它的评估方式。

换句话说,优先级有助于描述如何解析表达式。但它没有直接说明如何评估它。优先级告诉我们解析您询问的表达式的方法是:

      ||
      / \
     /   \
    &&   c++
   / \
  /   \
a++    b++

但是当我们去评估这个解析树时,&&||的短路行为告诉我们,如果左侧确定结果,我们就不会这样做。走右边,评估一切。在这种情况下,由于a++ && b++为真,||运算符知道其结果将为1,因此它不会导致c++部分被评估

这也是

等条件表达式的原因
if(p != NULL && *p != '\0')

if(n == 0 || sum / n == 0)

很安全。在*p为NULL的情况下,第一个不会崩溃,不会尝试访问p。如果n为0,则第二个不会除以0。

很容易得到错误的印象,优先顺序和评价顺序。当我们有一个像

这样的表达式时
1 + 2 * 3

我们总是说" *优于+的优先级意味着乘法首先发生"。但是如果我们抛出一些函数调用会怎么样:

f() + g() * h()

首先要调用这三个函数中的哪一个?事实证明我们不知道。优先权并没有告诉我们。编译器可以安排首先调用f(),即使最后需要它的结果。另请参阅this answer