在C中更改运算符的优先级

时间:2014-01-02 15:53:51

标签: c operators operator-precedence

作为&&的优先顺序更多(这是合适的调整吗?)而不是||的优先级,我写了这样的东西:

if (a || b && c ){ ....

我想该程序会首先找到b && c,我们称之为d,然后找到a || d,对吗?

我希望程序首先检查“a”语句,然后检查是否错误;检查b和c。这样的事情可能吗?

3 个答案:

答案 0 :(得分:5)

C中的逻辑表达式受short-circuit evaluation的约束。现在,正如你所说,

a || b && c

相同
a || (b && c)

因为优先权。

但首先评估a,因为评估顺序是从左到右。由于短路评估,只有当a为假时,程序才会继续评估b && c。所以,你的代码已经完成了你想要的东西。

答案 1 :(得分:2)

  

我希望程序首先检查“a”语句,然后检查是否错误;检查b和c。这样的事情可能吗?

是。你是对的。

a || b && c将被解析为a || (b && c),因为&&的优先级高于||运算符的优先级。 bc绑定到&& 由于逻辑运算符从左到右进行评估,所以首先评估a,如果是true则不会评估b && c,因为||运算符执行其操作数的短路评估。

如果a评估为false,则会评估b && c,其中b首先评估,true c是评估,否则c将不会被评估,因为&&执行其操作数的短路评估的原因相同。

答案 2 :(得分:0)

  

我想该程序将首先找到b&& c,我们称之为d,然后找到一个|| d,对吧?

没有。

首先,运算符优先级仅影响运算符和操作数的分组;它不会影响表达式的计算顺序。通常,评估顺序是未指定;例如,在a + b * c这样的表达式中,abc中的每一个都可以按任何顺序评估。同样,必须在b * c之前评估a + b * c,但这并不意味着必须在b * c之前评估a

||&&运算符的特殊之处在于它们强制从左到右的评估;首先将对左侧进行全面评估(并应用所有副作用)。此外,两个运营商都使用“短路”评估;如果表达式的值可以从左侧操作数确定,那么右侧操作数将不会被评估

由于&&的优先级高于||,因此表达式将被解析为a || (b && c),这意味着a的结果将与b && c的结果进行“或”运算{1}}。但是,由于||&&强制从左到右评估,因此将首先评估a。如果a的结果为0,则将评估b。如果b的结果不为零,则会评估c。如果b为0,则不会评估c。如果a不为零,则不会评估bc

这是一张显示各种可能性的表格; NZ表示“非零”,NE表示“未评估”:


a    b    c      b && c      a || b && c
-    -    -      ------      -----------
0    NZ   NZ     true  (1)   true  (1)
0    NZ   0      false (0)   false (0)
0    0    NE     false (0)   false (0)
NZ   NE   NE     NE          true  (1)