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

mrk*_*rks 55 c

在具有多个条件的if语句中,如果第一个条件的结果清楚,则执行第二个条件吗?

例:

if(i>0 && array[i]==0){
}
Run Code Online (Sandbox Code Playgroud)

如果我交换条件,则i的负值可能会发生段错误,但这样就不会发生段错误.我可以确定这总是有效或者必须使用嵌套的if语句吗?

Uri*_*Uri 81

这种评估称为短路.一旦结果100%清除,它就不会继续评估.

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

if (pX!=null && pX->predicate()) { bla bla bla }
Run Code Online (Sandbox Code Playgroud)

如果更改了条件的顺序,则可能在空指针上调用方法并崩溃.当你有一个指向该结构的指针时,C中的类似示例将使用结构的字段.

您可以使用或执行类似的操作:

if(px==null || pX->isEmpty()} { bla bla bla }
Run Code Online (Sandbox Code Playgroud)

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

例如,假设你有:

if(x==4 && (++y>7) && z==9)
Run Code Online (Sandbox Code Playgroud)

如果x4,那么y无论z或者的值如何都将递增y,但如果x不是4,则它将不会递增.


Joh*_*ode 32

操作员&&||保证在评估右侧之前将对左侧表达式进行全面评估(并应用所有副作用).换句话说,运算符引入了一个序列点.

另外,如果可以从lhs确定表达式的值,则不评估rhs.换句话说,如果你有一个类似的表达式x && y,并且x的计算结果为0(false),那么无论y如何,表达式的值都是false,因此不计算y.

这意味着类似x++ && x++的表达式是明确定义的,因为它&&引入了一个序列点.


Shi*_*dim 18

从草案3485(n3485.pdf)中明确指出

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

logical-and-expression: 
      inclusive-or-expression
      logical-and-expression && inclusive-or-expression 
Run Code Online (Sandbox Code Playgroud)
  1. &&运算符从左到右分组.操作数都在上下文中转换为bool(第4条).如果两个操作数都为真,则结果为true,否则为false.与&不同,&&保证从左到右的评估:如果第一个操作数为假,则不评估第二个操作数.
  2. 结果是布尔.如果评估第二表达式,则在与第二表达式相关联的每个值计算和副作用之前,对与第一表达式相关联的每个值计算和副作用进行排序.