语句中运算符的优先级和执行

时间:2019-05-21 07:30:59

标签: c boolean operator-precedence

无法理解如何为布尔变量“ check”分配1或0。这里2 == 2为true,但是2不等于3,因此应该为false .....

/* practicing the precedence of assignment operator */

#include <stdio.h>

int main() {

    _Bool check;
    check = (2 == 2 != 3);

    printf("the value of _Bool is %d\n",check);


    return 0;
}

我希望结果为假

3 个答案:

答案 0 :(得分:1)

实际发生的事情是这样的

(2 == 2 != 3)

成为

(2 == 2) != 3)

(1 != 3)

反过来变成

(1)

也许您需要的是

(2 == 2 && 2 != 3)

答案 1 :(得分:0)

两件事:

  • 相等运算符具有same precedence and left to right associativity,因此(2 ==2 != 3)((2 == 2) != 3)相同,而(1 != 3)是正确的。
  • 相等操作返回一个int值,因此不需要使用_Bool(或将boolstdbool.h一起使用。

答案 2 :(得分:0)

对于==!=来说,

运算符优先级相同,因为它们都属于同一组相等运算符。为了区分具有相同优先级的运算符,我们使用该组的 operator关联性,在这种情况下,是从左到右。意味着保证2 == 2 != 3被解析为(2 == 2) != 3。这样我们得到:

  • 2 == 2-> 1
  • 1 != 3-> 1

值得注意的是,==!=的优先级都高于=,因此表达式= (2 == 2 != 3)中的括号是不需要的(但如果您是不确定优先级)。


关于执行/评估的顺序,这是另一个术语,请勿与运算符优先级混淆。表达式中==!=操作数的求值顺序未指定,这意味着我们不知道哪个将首先执行。

在这种情况下,这没有关系,但是如果我们有这个check = a() == b() != c();,那就可以了。在这里,我们不知道首先执行的三个函数中的哪个。我们只知道运算符优先级表明a的结果应该与b的结果之前的c的结果进行比较,但是函数c可能仍被执行首先。

相关问题