C是否始终评估与&&或||连接的所有语句

Chr*_*ris 3 c evaluation

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

假设我有一些条件条款由几个条件组成.比如像

  if((a == b && strcmp(string1, string)) || x <= 5)
Run Code Online (Sandbox Code Playgroud)

我的问题是:无论第一个结果是什么结果,所有这些陈述都会被评估,或者一旦结果明确,评估就会停止.

由于我不确定我的问题是否清楚,这是一个例子:

  if(a == 5 || b > 12 || (c = someFun()) == 3)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,如果a == 5,则不需要进一步检查,因为big语句的结果为TRUE,所以我们可以继续.这意味着不会评估someFun().

是这样的吗?我知道Java在&&和&resp之间有所不同.|| 和| (后者在C中无法提供),但我不知道C如何处理这个问题

Mat*_*Mat 14

这些运算符在C(和C++)中是短路的.

  • 短路评估......这是我一直在寻找的术语,但是再也记不住了:) (3认同)

Gle*_*nnS 5

C评估直到它知道答案为止,所以:

EvalsToTrue()&& EvalsToAnything()评估两者

EvalsToFalse()&& EvalsToAnything()仅评估第一个

EvalsToTrue()|| EvalsToAnything()仅评估第一个

EvalsToFalse()|| EvalsToAnything()评估两者