2

「if」などの条件文が C/C++ やその他のプログラミング言語でどのように実装されているか知りたいです。

したがって、次の 2 つの方法で if 文を記述した場合、計算コストの点でどのように違いますか。

方法私:

if(statement1)
    return true;
if(statement2)
    return true;
if(statement3)
    return true;

方法 II:

if(statement1 || statement2 || statement3)
    return true;

2 番目の方法では、すべてのステートメントが最初に評価され、次にその結果に OR 演算が適用されますか、または OR 演算が最初に認識され、ステートメントが true と評価されるとすぐに true 値が返されますか? 後者は、最初の true を取得するとすぐにジョブが完了するため、条件内のすべてのステートメントを必ずしも評価する必要がないため、計算コスト/時間を節約できます。ただし、これは条件内の操作に依存します。AND の場合は、まったく別のケースになります。そして、組み合わせ操作(AND + OR + XOR ..)で物事はより巧妙になります

では、それは実際にどのように行われているのでしょうか。実装が条件内のブール演算に依存することは可能ですか?

4

6 に答える 6

4

「if」などの条件文が C/C++ やその他のプログラミング言語でどのように実装されているか知りたいです。

お使いのコンピューターのアセンブリ言語に依存します。たとえば、x86 命令リストでは、命令CMPがフラグを設定し、J**( JNEJA、 ...) などの命令によって読み取られます。

これは通常、条件が「実装」される方法です。

2 番目の方法では、すべてのステートメントが最初に評価され、次にその結果に OR 演算が適用されますか、または OR 演算が最初に認識され、ステートメントが true と評価されるとすぐに true 値が返されますか?

C では&&||二項演算子は短絡評価を使用します。つまり、 inが true のE1 || E2場合は評価されません。E1E2

于 2013-06-06T16:40:34.753 に答える
2

実装コンパイラと最適化の設定によって異なります。場合によっては、Way II (OR 条件を持つもの) が「短絡」により高速になります。演算子が true の場合、残りの条件はチェックされません。一方、Way I では、何らかの最適化 (またはスマート コンパイラ) を使用して Way II に変換しない限り、条件は順次実行されます (この場合、両方の Way が同等に高速です)。

于 2013-06-06T16:57:57.780 に答える
1

標準によると:


5.15 論理和演算子

   logical-or-expression:
     logical-and-expression
     logical-or-expression || logical-and-expression

1 || 演算子グループは左から右へ。オペランドは両方とも文脈上 bool に変換されます (条項 4)。オペランドのいずれかが true の場合は true を返し、それ以外の場合は false を返します。|とは異なり、|| 左から右への評価を保証します。さらに、最初のオペランドが true と評価された場合、2 番目のオペランドは評価されません。

2 結果はブール値です。2 番目の式が評価される場合、最初の式に関連付けられたすべての値の計算と副作用は、2 番目の式に関連付けられたすべての値の計算と副作用の前に並べられます。


その他の事実 - コンパイラがルールを遵守しているかどうか。

于 2013-06-06T16:49:54.270 に答える
1

スマート コンパイラは、Way I を Way II に変換します。

方法 II は、各ステートメントをチェックし、真に遭遇するとすぐに真を返します。

于 2013-06-06T16:40:09.577 に答える
1

コンパイラに依存します。オブジェクト ファイルを生成する gcc -o を使用すると、何が起こるかを確認できます。オブジェクト ファイルを開くと、コンパイラがどのように最適化するかがわかります。通常、(長い条件の場合) ジャンプ テーブルを作成しますが、条件プロセッサ命令のみを使用する場合もあります。

于 2013-06-06T16:39:44.503 に答える