論理演算子 - 1

「こんにちは、アミーゴ!」

「これから、論理演算子について簡単なレッスンをしていきます。」

「どんな論理演算子を知っていますか?」

— 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 番目の部分は必要ありません。」

「そうなんです。いい技術ですよね?」

「はい。」