各if
のreturn
ステートメントで。
コードでは、if条件ごとにreturn
ステートメントがあります。このような状況が発生した場合、これを書くには2つの方法があります。最初は、あなたが、実施例1でそれを書いた方法です:
if (a == b1) {
return c1;
} else if (a == b2) {
return c2;
} else {
return c11;
}
次のように他のです:
if (a == b1) {
return c1;
}
if (a == b2) {
return c2;
}
return c11; // no if or else around this return statement
あなたのコードを書くのこれらの二つの方法が同一です。
例2でコードを書いた方法は、コンパイラがa
のすべての可能な値をカバーしていることを知らないので、C++やJavaでコンパイルしませんでした(Cでは未定義の動作です)。戻り値を返さずに関数の最後まで到達できるコードパスが関数内にあると考えます。各if
ブランチでreturn
文なし
if (a == b1) {
return c1;
}
if (a == b2) {
return c2;
}
...
if (a == b11) {
return c11;
}
// what if you set a to some value c12?
。
各if
ブランチでreturn
文がなければ、あなたのコードは次の文が真である場合にのみ、機能的に同一である:
- あなたは
if
枝のいずれかでa
の値を変化させません。
==
は(数学的意味で)等価関係であり、からb11
のどれも同じ等価クラスにはありません。
==
には副作用がありません。ポイント#2(および#3を指す)についてさらに明確にするため
:
==
は常にCまたはJavaにおける同値関係であり、決して副作用を有します。
==
演算子(C++、Ruby、Scalaなど)をオーバーライドできる言語では、オーバーライドされた==
演算子は等価関係ではなく、副作用を伴う可能性があります。 ==
オペレータを上書きした者は、副作用のない等価関係を作成するのに十分な正気であったことは確かですが、保証はありません。
- タイプ変換規則の緩いJavaScriptやその他のプログラミング言語では、
==
が非正則でないか、または対称でない言語が組み込まれている場合があります。 (JavaScriptでは、===
は等価関係です。)
パフォーマンスに関して、例1は、一致するものの後に比較を実行しないことが保証されています。コンパイラが#2を最適化して余分な比較をスキップすることは可能かもしれませんが、そうは考えにくいでしょう。次の例ではおそらくできません。文字列が長い場合は余分な比較が安くありません。
if (strcmp(str, "b1") == 0) {
...
}
if (strcmp(str, "b2") == 0) {
...
}
if (strcmp(str, "b3") == 0) {
...
}
どの言語を参照していますか? JavaまたはC++? – Billjk
それは私のためのJavaですが、私はC++とJavaの両方のためにこれを使っています... – Lily
C + +で 'operator =='を実装することができますので、大きな違いです(副作用)最適化にも影響します...)。 AFAICRこれはJavaでは動作しません。 – bitmask