如果我写:
if(somePtr != NULL && somePtr->someFun() == SUCCESS )
{
/**/
}
是否可以确保在somePtr != NULL
之前检查somePtr->someFun() == SUCCESS
?
我的编译器是否有可能重新排序这两个?
答案 0 :(得分:1)
我的编译器是否有可能重新排序这两个?
不。保证&&
仅在第一个表达式为true
时才计算第二个表达式(顺便提一下,它还在整个表达式中引入了一个序列点)。
&&操作员组从左到右。操作数都在上下文中转换为bool类型(第4条)。如果两个操作数都为真,则结果为true,否则为false。 与
&
不同,&&
保证从左到右的评估:如果第一个操作数为false,则不评估第二个操作数。结果是布尔。如果计算第二个表达式,则在每个值计算和与第二个表达式相关的副作用之前,对与第一个表达式关联的每个值计算和副作用进行排序。
(C ++ 11,[expr.log.and];强调添加)