在C++中,如果条件执行顺序

3

我有一个C++中的if块,如下所示:

if( node != NULL && node->next !=NULL ){
    //do some stuff
}

请问我是否需要将node和node->next分别放入两个if块中?或者保证在执行node->next!=NULL之前,先执行node!=NULL吗?这与IT技术有关。


3
不需要拆分。短路求值将占主导地位,如果第一个表达式已被判定为假,则可以避免第二个表达式。 - WhozCraig
node!=NULL 会在 node->next!=NULL 之前被执行 - Donal
只要您的类型未重载 operator&&(在这种情况下,它是 operator!= 的结果,它是一个 bool,因此您可以相信 operator&& 未被重载),它将短路并按预期工作。如果有人重载了 operator&&,它就失去了短路的能力。 - YoungJohn
4个回答

15

这是一个短路求值,操作符&&保证左边的表达式在右边之前被完全求值

来自标准:

5.14 逻辑与操作符 [expr.log.and]

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

2
不需要。逻辑与运算符 “&&” 是“短路”的,如果左侧的操作数计算结果为假,则右侧的操作数不会被计算,因为结果已经确定了。(类似地,当左侧操作数为真时,“||”运算符将不会计算右侧操作数。)

0

不需要这样做。node!=NULL 会先执行,如果为假,则不会评估其余条件。


0
如果第一个条件为假,则不会评估第二个条件,因为无论第二个条件的评估结果如何,完整表达式都将等于false。
根据C++标准:
1. &&运算符从左到右分组。操作数都被上下文转换为bool(第4条)。如果两个操作数都为true,则结果为true,否则为false。与&不同,&&保证从左到右进行评估:如果第一个操作数为false,则不评估第二个操作数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接