代码之家  ›  专栏  ›  技术社区  ›  Krash

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

  •  0
  • Krash  · 技术社区  · 7 年前

    在以下代码中,

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

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

    2 * 3 + 3 * 4
    

    我们将通过首先计算乘积,然后求和来计算上述表达式,为什么c不这样做呢?首先计算所有一元运算符,然后计算逻辑对象?

    1 回复  |  直到 7 年前
        1
  •  6
  •   Steve Summit    7 年前

    请认识到 优先 评估顺序 。的特殊行为 && || 表示如果不必对右侧进行评估,则根本不会对其进行评估。优先级告诉您如果对其进行评估,将如何对其进行评估。

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

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

    但当我们评估这个解析树时 && || 告诉我们,如果结果是由左手决定的,我们根本就不会从右手开始评估任何东西。在这种情况下,因为 a++ && b++ 是真的 || 运算符知道其结果将为1,因此不会导致 c++ 需要评估的零件。

    这也是为什么条件表达式

    if(p != NULL && *p != '\0')
    

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

    都是安全的。第一个不会崩溃,不会尝试访问 *p ,如果 p 为空。如果 n 为0。


    评价的先后顺序很容易让人产生错误的印象。当我们有这样的表达

    1 + 2 * 3
    

    我们总是说“更高的优先级 * 结束 + 意味着乘法首先发生”。但是如果我们加入一些函数调用,比如:

    f() + g() * h()
    

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