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