私が書く場合:
if(somePtr != NULL && somePtr->someFun() == SUCCESS )
{
/**/
}
somePtr != NULL
事前にチェックされるので安心somePtr->someFun() == SUCCESS
でしょうか?
コンパイラがこれら 2 つの順序を変更する可能性はありますか?
私が書く場合:
if(somePtr != NULL && somePtr->someFun() == SUCCESS )
{
/**/
}
somePtr != NULL
事前にチェックされるので安心somePtr->someFun() == SUCCESS
でしょうか?
コンパイラがこれら 2 つの順序を変更する可能性はありますか?
コンパイラがこれら 2 つの順序を変更する可能性はありますか?
いいえ。&&
は、最初の式が評価される場合にのみ 2 番目の式を評価することが保証されていますtrue
(ちなみに、式全体にシーケンス ポイントも導入されます)。
&& 演算子は左から右にグループ化します。オペランドは両方とも、コンテキストに基づいて bool 型に変換されます (条項 4)。両方のオペランドが true の場合、結果は true になり、それ以外の場合は false になります。とは異なり
&
、&&
左から右への評価が保証されます。最初のオペランドが false の場合、2 番目のオペランドは評価されません。結果はブール値です。2 番目の式が評価される場合、最初の式に関連付けられたすべての値の計算と副作用は、2 番目の式に関連付けられたすべての値の計算と副作用の前に並べられます。
(C++11、[expr.log.and];強調追加)