「ブール短絡は、」標準または単にほとんどの最適化として使用によって決定されていますか? [重複]
-
21-08-2019 - |
質問
これを考えてみましょう。
Class* p = NULL;
if( p != NULL && p->Method() == OK ){
// stuff
}
私が一緒に働いてきたすべてのコンパイラでは、これは非常に安全です。即ちブール式の最初の部分)が 偽、及び方法(への呼び出しを評価して第2の部分は冗長で評価するため試みられません。
は、このほとんどのコンパイラは、第二部の評価を離れて最適化する、またはそれはC / C ++標準から指示される動作ですので、?
解決
これはブール短絡と呼ばれ、多くの言語に定義されています。 ここの言語がこの機能を持っているかを説明Wikipediaの記事です。
は、今、あなたは機能の正しい名前を知っていること、のそれについての他のSOの記事をhref="https://stackoverflow.com/search?q=short+circuit">があります。
他のヒント
式短い切断は規格によって保証されている。
С++標準1998
5.14
&&演算子のグループは左から右へ。 オペランドが暗黙のうちにともに BOOL(条項4)を入力するように変換されます。ザ・ 両方のオペランドがある場合、結果は真であります そうでない場合はtrueとfalse。異なり&、&& 左から右への評価保証: 第2オペランドがあれば評価されません 最初のオペランドがfalseます。
私は、それはまだ言及見ていない。
ショートサーキットは、の呼び出され&&
又は||
オペレータがオーバーロードされた場合を除いてC ++のによって保証されます。それはあまりにも紛らわしいですので、しかし、それをしないでください。
これは短絡と呼ばれる機能です。この動作は、C ++標準で保証されています。私はいわば最適化ですが、それははるかに簡単に言語機能のだと信じていません。
これは単に最適化はありません、それはあなたがより簡潔にできるようにすると便利です。
あなたの例が示すように、、それはあなたが1行に「安全な」逆参照文を書くことができます。そうでなければ、あなたのような何かをする必要があります:
if (p != null) {
if (p.getValue() == 3) {
// do stuff
}
}
些細なようだが、それ(例えばVB6)を持っていて、痛んでそれを見逃すことは始まっていない言語でコーディングしてみます。
他の回答が言及ように、それは言語標準でだが、このような何かを明確に指定する必要がありますだけの理由。それはおそらく最適化コードまでコンパイルできること副作用です。これらの日は、まともなCまたはC ++コンパイラがequivilently 1行または2行の文をコンパイルします。