
「こんにちは、アミーゴ!」
「これから、論理演算子について簡単なレッスンをしていきます。」
「どんな論理演算子を知っていますか?」
— OR (||)、AND (&&)、NOT(!)
「はい。よくやった。それで、どのように機能するか覚えていますか?」
"はい。"
「少なくとも 1 つのオペランドが true の場合、OR は true を返します。」
「AND は、両方のオペランドが true の場合に true を返します。」
「NOT は true を false に、false は true に変更します。」
「そうです。では、この式では演算子はどのような順序で評価されますか?」
boolean a = true;
boolean b = false;
boolean c = true;
boolean result = a && b || !c && b || !a;
「これはすべて非常に簡単です。」
「最初に NOT (!)、次に AND (&&)、そして最後に OR (||) を入力します。」
括弧を追加すると、次のようになります。
boolean a = true;
boolean b = false;
boolean c = true;
boolean result = (a && b) || ((!c) && b) || (!a);
「それはすべて正しいです。うまくいきました。結果はどうなりましたか?」
— 1) (a && b) == (true && false) == false
2) ((!c) && b) == (false && false) == false
3) (!a) == false
4) 偽 || 偽 || false == false
「結果は偽です。」
「あなたはこの話題について完全にご存じのようですね。それでは、ちょっとした秘密をいくつか教えてあげましょう。」
「まず、論理式は左から右に評価されます。」
「2 番目に、ここでは短絡評価が使用されます (計算は必要な場合にのみ実行されます)。式の一部を評価することで最終結果がすでにわかっている場合、式の残りの部分は評価されません。」
boolean result = (true && false) || (true && true) || (true && false);
「この式は、OR (||) 演算子で区切られた 3 つの部分に分かれています。」
「少なくとも 1 つの部分が true であれば、答えは true となり、他には何も考慮する必要はありません。したがって、式は次のように評価されます。」
1) 最初の部分を評価します: (true && false) == false
2) 2 番目の部分を評価します: (true && true) == true
3)答えがtrueであることがすでに明らかであるため、3 番目の部分は評価しません。
「このアプローチは遅延評価とも呼ばれます。」
「わかりました。それで、何が特別なのでしょうか?」
「式内のメソッドの呼び出しを開始するまでは何もありません。式の一部がスキップされた場合、スキップされた部分のメソッドは呼び出されません。」
「しかし、このアプローチは非常に一般的になりました。その理由は次のとおりです。」
Job job = null;
if (job != null && job.isDone())
{
…
}
「式の評価時に job が null の場合、job.isDone() 呼び出しは行われません。」
「確かに、式の最初の部分は false で、その後に AND (&&) が続きます。したがって、式全体が false であることがわかり、2 番目の部分は必要ありません。」
「そうなんです。いい技術ですよね?」
「はい。」
GO TO FULL VERSION