具有多个条件的if的执行顺序

在有多个条件的if语句中,如果第一个条件的结果是明确的,那么是否是第二个条件执行?

例:

if(i>0 && array[i]==0){ } 

如果我交换条件,可能会出现段错误,因为i的负值,但是这样就不会发生段错误。 我可以肯定,这总是工作或必须使用嵌套if语句?

这种types的评估被称为短路 。 一旦结果是100%清楚,它不会继续评估。

这实际上是一种常见的编程技术。 例如,在C ++中,您经常会看到如下所示的内容:

 if (pX!=null && pX->predicate()) { bla bla bla } 

如果你改变了条件的顺序,你可能会调用一个空指针的方法并崩溃。 当你有一个指向这个结构体的指针时,C中的一个类似的例子将使用一个结构体的字段。

你可以做一些类似的或:

 if(px==null || pX->isEmpty()} { bla bla bla } 

这也是在if条件下避免副作用通常是好主意的原因之一。

例如,假设你有:

 if(x==4 && (++y>7) && z==9) 

如果x4 ,那么无论zy的值是多less, y都会增加,但是如果x不是4 ,它将不会增加。

运算符&&|| 保证在评估右侧之前,将对左侧expression式进行全面的评估(以及所有的副作用)。 换句话说,运营商引入了一个序列点。

此外,如果可以从lhs确定expression式的值,则不评估rhs。 换句话说,如果你有一个像x && y这样的expression式,并且x的计算结果为0(false),那么无论y如何,expression式的值都是false,所以y不被计算。

这意味着像x++ && x++这样的expression式是很好定义的,因为&&引入了一个序列点。

从草案3485(n3485.pdf)明确表示

5.14逻辑AND运算符[expr.log.and]

 logical-and-expression: inclusive-or-expression logical-and-expression && inclusive-or-expression 
  1. &&运算符组从左到右 。 操作数都被上下文转换为bool(条款4)。 如果两个操作数都为真,结果为真,否则为真。 不同于&& &&保证从左至右的评估 :如果第一个操作数为假,则不评估第二个操作数。
  2. 结果是一个布尔。 如果评估第二expression式,则在与第二expression式相关联的每个值计算和副作用之前对与第一expression式相关联的每个值计算和副作用进行sorting。