C++ 我的编译器会重新排序这个表达式吗?

C++ 我的编译器会重新排序这个表达式吗?,c++,C++,如果我写: if(somePtr != NULL && somePtr->someFun() == SUCCESS ) { /**/ } 能保证somePtr!=在somePtr->someFun()==SUCCESS之前将检查NULL 我的编译器是否有可能对这两个进行重新排序 我的编译器是否有可能对这两个进行重新排序 没有。只有当第一个表达式为true(顺便提一下,它还向整个表达式中引入了一个序列点)时,才能保证&&对第二个表达式求值 &&运算符从左向右分组。操

如果我写:

if(somePtr != NULL && somePtr->someFun() == SUCCESS )
{
    /**/
}
能保证
somePtr!=在
somePtr->someFun()==SUCCESS
之前将检查NULL

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

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

没有。只有当第一个表达式为
true
(顺便提一下,它还向整个表达式中引入了一个序列点)时,才能保证
&&
对第二个表达式求值

&&运算符从左向右分组。操作数都在上下文中转换为bool类型(第4条)。如果两个操作数都为true,则结果为true,否则为false。与
&
不同,
&&
保证从左到右求值:如果第一个操作数为false,则不求值第二个操作数

结果是一场闹剧。如果对第二个表达式求值,则与第一个表达式关联的每个值计算和副作用都将在与第二个表达式关联的每个值计算和副作用之前排序


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

感谢您提供给我这些信息。我将研究一下标准文档。请注意:对于内置操作符&&,这是正确的。重载运算符&(这里不是这种情况)不能保证求值或短路的顺序。