我的编译器会重新排序此表达式吗?

时间:2013-04-08 01:27:23

标签: c++

如果我写:

if(somePtr != NULL && somePtr->someFun() == SUCCESS )
{
    /**/
}

是否可以确保在somePtr != NULL之前检查somePtr->someFun() == SUCCESS

我的编译器是否有可能重新排序这两个?

1 个答案:

答案 0 :(得分:1)

  

我的编译器是否有可能重新排序这两个?

不。保证&&仅在第一个表达式为true时才计算第二个表达式(顺便提一下,它还在整个表达式中引入了一个序列点)。

  

&&操作员组从左到右。操作数都在上下文中转换为bool类型(第4条)。如果两个操作数都为真,则结果为true,否则为false。 &不同,&&保证从左到右的评估:如果第一个操作数为false,则不评估第二个操作数。

     

结果是布尔。如果计算第二个表达式,则在每个值计算和与第二个表达式相关的副作用之前,对与第一个表达式关联的每个值计算和副作用进行排序。

(C ++ 11,[expr.log.and];强调添加)