3

が、これは非常に安全である、私が働いてきたすべてのコンパイラでは、この"ブール短絡"は標準で規定されているのか、あるいはほとんどが最適化として使用されていますか?

Class* p = NULL; 
if(p != NULL && p->Method() == OK){ 

    // stuff 
} 

を考えてみましょう。私。ブール式の最初の部分はfalseと評価され、2番目の部分の評価が冗長なので、Method()の呼び出しは行われません。

これは、ほとんどのコンパイラが2番目の部分の評価を最適化するか、C/C++標準の命令による動作ですか?

+0

ここでは簡単な注釈を追加するだけですが、コンパイラは標準で許可されていないとanythinを最適化しません。コンパイラの仕事は、あたかも標準が守られているかのように動作するコードを生成することです。したがって、コンパイラは、プログラムの動作に影響を与える可能性のあるコードを決して最適化してはなりません。 – jalf

+2

まあ、私は決してdupとして彼自身の質問を閉じるために投票した人を見たことはありません。私はあなたがそのバッジに値すると思う! –

+0

@Paul:乾杯しますが、これは最初から何を検索するのか分からなかったので特別なケースです。 – sharkin

答えて

4

これは論理積短絡と呼ばれ、多くの言語で定義されています。 Hereは、この機能を持つ言語を説明するウィキペディアの記事です。

この機能の正しい名前がわかったので、それについてもother SO articlesがあります。

4

標準による切れ味の表現が保証されています。

2

これは短絡と呼ばれる機能です。この動作はC++標準によって保証されています。私はそれが最適化されているとは言いませんが、それは単なる言語機能のはるかに多くのものです。

4

С++標準1998
5.14

& &オペレーターグループは左から右へ。 オペランドは両方とも暗黙的に をbool型(4節)に変換します。 の結果は、両方のオペランドが の場合はtrue、そうでない場合はfalseです。 &とは異なり、& & は左から右の評価を保証します。 第1オペランドがfalseの場合、第2オペランドは評価されません。

+0

どの規格ですか?私たちはC言語とC++の標準を持っています。他の多くの言語はもちろんのこと、C言語の2つのバージョンも保証しています。 –

2

私は、それはまだ言及見ていない:

ショートサーキットが呼び出され&&または||オペレータがオーバーロードされているときを除いてC++ によって保証されています。しかし、それはあまりにも混乱しているので、それをしないでください。

2

これは単なる最適化ではなく、より簡潔にするのに役立ちます。

この例で示すように、1行に「安全な」逆参照文を書くことができます。そうでなければ、あなたは次のように何かをする必要があります:

if (p != null) { 
    if (p.getValue() == 3) { 
     // do stuff 
    } 
} 

些細なようだが、それ(例えばVB6)を持っていて、痛んでそれを見逃すことは始まっていない言語でコーディングしてみてください。

これは他の回答にも言及されていますが、このようなことは明確に指定する必要があるためです。最適化されたコードにコンパイルできる可能性は副作用です。最近では、まともなCまたはC++コンパイラが1行または2行の文を均等にコンパイルすることになります。

関連する問題