C是否始终评估与&&和或||

时间:2011-04-01 13:39:26

标签: c evaluation

我在这里有一个非常简单的问题,但我找不到答案:

假设我有一些条件条款由几个条件组成。例如。

之类的东西
  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如何处理这个

4 个答案:

答案 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)

评估从最左边开始..并在整体条件不再有效时退出..