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

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

例如:

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

如果我交换条件语句,i 的负值可能会出现 Segfault,但是这样就不会出现 Segfault。我是否可以确定这总是有效的,或者必须使用嵌套的 if 语句?

106551 次浏览

这种类型的评估称为 短路。 一旦结果是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的值是多少,y都会增加,但是如果 x不是 4,则 y根本不会增加。

操作符 &&||保证在计算右侧表达式之前完全计算左侧表达式(以及应用的所有副作用)。换句话说,运算符引入一个序列点。

此外,如果可以从 lhs 确定表达式的值,则不计算 rhs。换句话说,如果有一个像 x && y这样的表达式,x 的值为0(false) ,那么表达式的值就是 false,与 y 无关,因此不计算 y。

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

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

5.14逻辑 AND 操作符[ expr.log.AND ]

logical-and-expression:
inclusive-or-expression
logical-and-expression && inclusive-or-expression
  1. & & 操作员组 从左到右 操作数都在上下文中转换为 bool (条款4) 如果两个操作数都为 true 和 false,则 result 为 true & ,保证从左到右的评估: 第二个操作数不是 计算第一个操作数是否为 false。
  2. 结果是一个 bool。如果 第二个表达式求值,每个值计算和边 与第一个表达式相关联的效应在每个 价值计算和副作用相关的第二 表情。