このことを考慮
Class* p = NULL;
if( p != NULL && p->Method() == OK ){
// stuff
}
私が使用したすべてのコンパイラで、これは非常に安全です。つまり、ブール式の最初の部分はfalseと評価され、2 番目の部分の評価は冗長であるため、 Method() の呼び出しは試行されません。
これは、ほとんどのコンパイラが 2 番目の部分の評価を最適化するためでしょうか、それとも C/C++ 標準から指示された動作でしょうか?
このことを考慮
Class* p = NULL;
if( p != NULL && p->Method() == OK ){
// stuff
}
私が使用したすべてのコンパイラで、これは非常に安全です。つまり、ブール式の最初の部分はfalseと評価され、2 番目の部分の評価は冗長であるため、 Method() の呼び出しは試行されません。
これは、ほとんどのコンパイラが 2 番目の部分の評価を最適化するためでしょうか、それとも C/C++ 標準から指示された動作でしょうか?
С++標準1998
セクション5.14
&&演算子は左から右にグループ化します。オペランドは両方とも暗黙的にbool型に変換されます(4節)。結果は、両方のオペランドがtrueの場合はtrue、それ以外の場合はfalseです。&とは異なり、&&は左から右への評価を保証します。最初のオペランドがfalseの場合、2番目のオペランドは評価されません。
式のショートカットは標準で保証されています。
これはブール短絡と呼ばれ、多くの言語で定義されています。 これは、どの言語にこの機能があるかを説明するウィキペディアの記事です。
機能の正しい名前がわかったので、それに関する他の SO 記事もあります。
私はそれがまだ言及されているのを見たことがないので、:
呼び出されるor演算子が過負荷の場合を除いて、&&
||
C++によって短絡が保証されます。しかし、それはあまりにも混乱しているので、そうしないでください。
最適化だけでなく、より簡潔にするのも便利です。
例が示すように、「安全な」間接参照ステートメントを1行で記述できます。それ以外の場合は、次のようなことを行う必要があります。
if (p != null) {
if (p.getValue() == 3) {
// do stuff
}
}
些細なことのように思えますが、それがない言語(VB6など)でコーディングしてみると、それをひどく見逃し始めます。
他の回答が述べているように、これは言語標準に含まれていますが、これは、このようなものを明確に指定する必要があるためです。最適化されたコードにコンパイルできる可能性があることは副作用です。最近では、まともなCまたはC ++コンパイラは、1行または2行のステートメントを同等にコンパイルします。
これは短絡と呼ばれる機能です。この動作は、C++ 標準によって保証されています。いわば最適化だとは思いませんが、それは単なる言語機能にすぎません。