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

Kra*_*ash 0 c operator-precedence

在以下代码中,

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

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

2 * 3 + 3 * 4
Run Code Online (Sandbox Code Playgroud)

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

Ste*_*mit 6

请认识到,优先是不一样的概念,作为评价的顺序.特殊行为&&||表示,如果没有必要,右侧不会被评估.Precedence会告诉您如何评估它的评估方式.

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

      ||
      / \
     /   \
    &&   c++
   / \
  /   \
a++    b++
Run Code Online (Sandbox Code Playgroud)

但是当我们去评估这个解析树时,它的短路行为&&||告诉我们如果左侧确定了结果,我们就不会走右边并评估任何东西.在这种情况下,由于a++ && b++是真的,||操作员知道其结果将是1,因此它根本不会导致c++部件被评估.

这也是条件表达式的原因

if(p != NULL && *p != '\0')
Run Code Online (Sandbox Code Playgroud)

if(n == 0 || sum / n == 0)
Run Code Online (Sandbox Code Playgroud)

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


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

1 + 2 * 3
Run Code Online (Sandbox Code Playgroud)

我们总是说" *超越的优先级+意味着乘法首先发生".但是,如果我们抛出一些函数调用,如下所示:

f() + g() * h()
Run Code Online (Sandbox Code Playgroud)

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