具有多个条件的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)
如果x
是4
,那么无论z
或y
的值是多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
- &&运算符组从左到右 。 操作数都被上下文转换为bool(条款4)。 如果两个操作数都为真,结果为真,否则为真。 不同于&& &&保证从左至右的评估 :如果第一个操作数为假,则不评估第二个操作数。
- 结果是一个布尔。 如果评估第二expression式,则在与第二expression式相关联的每个值计算和副作用之前对与第一expression式相关联的每个值计算和副作用进行sorting。