假设我有一些条件条款由几个条件组成。例如。
之类的东西 if((a == b && strcmp(string1, string)) || x <= 5)
我的问题是:所有这些陈述都会被评估,无论第一个陈述的结果如何,或者一旦结果明确,评估就会停止。
由于我不确定我的问题是否清楚,这是一个例子:
if(a == 5 || b > 12 || (c = someFun()) == 3)
在这种情况下,如果a == 5,则不需要进一步检查,因为big语句的结果为TRUE,所以我们可以继续。这意味着不会评估someFun()。
是这样的吗?我知道Java在&amp;&amp;和和&amp; RESP。 ||和| (后者在C中不可用),但我不知道C如何处理这个
答案 0 :(得分:14)
这些运算符在C(和C ++)中是short-circuiting。
答案 1 :(得分:5)
C评估直到它知道答案,所以:
EvalsToTrue()&amp;&amp; EvalsToAnything()评估两者
EvalsToFalse()&amp;&amp; EvalsToAnything()仅评估第一个
EvalsToTrue()|| EvalsToAnything()仅评估第一个
EvalsToFalse()|| EvalsToAnything()评估两者
答案 2 :(得分:1)
始终评估左侧表达式。右侧表达式评估如下:
a || b
评估为b
时才会评估a
- false
仅当a && b
评估为b
a
- true
&&
的优先级高于||
,因此
a || b && c
评估为b && c
时才会评估a
- false
仅当a && b || c
评估为c
a && b
- false
仅当(a || b) && c
评估为c
a || b
- true
仅当a && (b || c)
评估为b || c
a
- true
仅当a && b && c
评估为c
a && b
- true
仅当a || b || c
评估为c
a || b
- false
答案 3 :(得分:0)
评估从最左边开始..并在整体条件不再有效时退出..