8

私が条件を持っていると仮定しIFます:

if (A || B) 
    ∧
    |
    |
   left
{ 
   // do something  
}

Aここで、それが真の値を受け取る可能性が高いと仮定しますB。なぜ、どちらが左側にあるかを気にするのですか?

両方をIF角かっこで囲むと、(コードのプログラマーとして)両方の関係者が必要であることがわかります。

問題は、私の教授が講義ノートに、左側に「真を受け取る可能性が高い変数」を配置する必要があると書いたことです。

誰かがその利点を説明できますか?さて、私はそれを左側に置きます...私は何を得ていますか?実行時間?

4

9 に答える 9

25

左側の最も可能性の高い条件を選択するだけではありません。左側に安全ガードを配置することもできます。つまり、注文は 1 つだけです。検討

if (s == null || s.length() == 0) // if the String is null or empty.

最初の条件は 2 番目の条件が NPE のスローから保護するため、ここで順序を入れ替えることはできません。

同様に、あなたが持つことができます

if (s != null && s.length() > 0) // if the String is not empty

||真または偽である可能性が最も高いものを選択する理由は&&、2 番目の式で評価されるコストを回避するためのマイクロ最適化です。これが測定可能なパフォーマンスの違いにつながるかどうかは議論の余地があります.

于 2012-08-25T07:56:15.653 に答える
9

私はそれを左側に置きます...私は何を得ていますか?実行時間

||C++の演算子は短絡評価を使用しているためです。
すなわち:Bが評価された場合Aにのみ評価されfalseます。

ただし、C ++では、カスタムデータ型ではなく、「組み込み」データ型の短絡評価が保証されていることに注意してください。

于 2012-08-25T04:52:28.963 に答える
5

javadocによる

&&と|| 演算子は、2つのブール式に対してConditional-ANDおよびConditional-OR演算を実行します。これらの演算子は「短絡」動作を示します。つまり、第2オペランドは、必要な場合にのみ評価されます。

したがって、trueステートメントが最初に来る場合、実行時に2番目のオペランドを短絡します。

于 2012-08-25T04:51:33.683 に答える
2

多くの場合、わずかなパフォーマンスの向上を除けば、実際的な違いはありません。これが役立つのは、チェックが非常に高価な関数呼び出しである場合(ありそうもない)、または順番にチェックする必要がある場合です。たとえば、何かのプロパティをチェックし、その何かが最初にnilであるかどうかをチェックしたい場合は、次のようにします。

If(a!= nil && a.attribute == valid){}

于 2012-08-25T05:05:08.707 に答える
2

左側の式が真の場合、右側の式を評価する必要がないため、実行時に最適化できます。これは短絡と呼ばれる手法です。したがって、式が真である可能性が高い左側に配置することで、プログラムのパフォーマンスが逆の場合よりも向上することが期待できます。

于 2012-08-25T04:51:36.677 に答える
2

ifステートメントが短絡する原因となるため、真である可能性が高い条件を最初に配置する必要があります。つまり、答えが真であることがすでにわかっているため、ifステートメントの残りの部分は評価されません。これにより、コードがより効率的になります。

これは、ifステートメントが高価なものを評価している場合に特に役立ちます。

if(doExpensiveCheck1() || doExpensiveCheck2()) { }

この場合、チェックに費用がかかるため、最も可能性の高いチェックを最初に配置することはあなたの利益になります。

于 2012-08-25T04:51:51.187 に答える
0

はい、正確に、実行時間を増やしています。1回の操作ではそれほど多くないように見えますが、操作が何百万回も繰り返されることを覚えておく必要があります

1 つで十分なのに 2 つの評価を実行するのは理にかなっている理由

于 2012-08-25T05:52:22.130 に答える