c-如果有多个条件,则执行顺序

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

例:

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

如果我交换条件语句,则可能会针对i的负值发生段错误,但是这种方式不会发生段错误。 我可以确定这始终有效,还是必须使用嵌套的if语句?

mrks asked 2019-11-18T01:38:51Z
3个解决方案
81 votes

这种评估称为短路。一旦结果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,则根本不会增加。

Uri answered 2019-11-18T01:40:02Z
32 votes

运算符261898243130681010和261898243130681010369保证在评估右侧之前,将完全评估左侧表达式(并施加了所有副作用)。 换句话说,运算符引入了一个序列点。

此外,如果可以从lhs确定表达式的值,则不会评估rhs。 换句话说,如果您有一个类似于261898243130681010368的表达式,并且x的计算结果为0(假),则该表达式的值与y无关都为false,因此不会评估y。

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

John Bode answered 2019-11-18T01:40:42Z
17 votes

从草案3485(n3485.pdf)可以清楚地看出:

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

logical-and-expression: 
      inclusive-or-expression
      logical-and-expression && inclusive-or-expression 
  1. &&运算符组从左到右。 的   操作数都在上下文中转换为布尔值(第4条)。 的   如果两个操作数均为true,则结果为true,否则为false。 不像   &,&&保证从左到右求值:第二个操作数不是   评估第一个操作数是否为false。
  2. 结果是布尔。 如果   计算第二个表达式,计算每个值,   与第一个表达式相关的效果在每个   值计算和第二个副作用   表达。
Shiplu Mokaddim answered 2019-11-18T01:41:35Z
translate from https://stackoverflow.com:/questions/2456086/order-of-execution-for-an-if-with-multiple-conditionals