作为&&的优先顺序更多(这是合适的调整吗?)而不是||的优先级,我写了这样的东西:
if (a || b && c ){ ....
我想该程序会首先找到b && c
,我们称之为d
,然后找到a || d
,对吗?
我希望程序首先检查“a”语句,然后检查是否错误;检查b和c。这样的事情可能吗?
答案 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)
,因为&&
的优先级高于||
运算符的优先级。 b
和c
绑定到&&
由于逻辑运算符从左到右进行评估,所以首先评估a
,如果是true
则不会评估b && c
,因为||
运算符执行其操作数的短路评估。
如果a
评估为false
,则会评估b && c
,其中b
首先评估,true
c
是评估,否则c
将不会被评估,因为&&
执行其操作数的短路评估的原因相同。
答案 2 :(得分:0)
我想该程序将首先找到b&& c,我们称之为d,然后找到一个|| d,对吧?
没有。
首先,运算符优先级仅影响运算符和操作数的分组;它不会影响表达式的计算顺序。通常,评估顺序是未指定;例如,在a + b * c
这样的表达式中,a
,b
和c
中的每一个都可以按任何顺序评估。同样,必须在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
不为零,则不会评估b
和c
。
这是一张显示各种可能性的表格; 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)