邏輯運算符 - 1

“嗨,阿米戈!”

“現在我們要上一堂關於邏輯運算符的小課。”

“你知道哪些邏輯運算符?”

— 或 (||)、與 (&&)、非 (!)

“是的。幹得好。你還記得它們是如何工作的嗎?”

“是的。”

“當至少有一個操作數為真時,OR 為真。”

“當兩個操作數都為真時,AND 的結果為真。”

“不把真變假,把假變真。”

“沒錯。這個表達式中的運算符是按什麼順序求值的?”

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) == (真 && 假) == 假

2) ((!c) && b) == (假 && 假) == 假

3) (!a) == 錯誤

4)假|| 假 || 假 == 假

“結果是假的。”

“看來你對這個話題瞭如指掌,那我告訴你兩個小秘密。”

“首先,邏輯表達式是從左到右求值的。”

“其次,這裡使用了短路求值(僅在必要時才進行計算)。如果通過對錶達式的一部分求值已經知道最終結果,則不對錶達式的其餘部分求值。”

例子
boolean result = (true && false) || (true && true) || (true && false);

“此表達式分為三個部分,由 OR (||) 運算符分隔。”

“如果至少有一部分為真,則答案為真,無需考慮其他任何內容。因此,表達式的計算方式如下:”

1) 評估第一部分: (true && false) == false

2) 評估第二部分:  (true && true) == true

3)我們不評估第三部分,因為已經很清楚答案是true

“這種方法也稱為惰性評估。”

“好吧。它有什麼特別之處?”

“什麼都沒有——直到你開始調用表達式內部的方法。如果跳過了表達式的一部分,那麼跳過的部分中的方法將不會被調用。”

“但這種方法已經變得非常普遍。原因如下:”

例子:
Job job = null;

if (job != null && job.isDone())
{
…
}

“如果計算表達式時作業為空,則不會調用 job.isDone()!”

“事實上,表達式的第一部分是假的,後面是 AND (&&)。因此,整個表達式將被認為是假的,第二部分將不是必需的。”

“正是。這是一個很好的技術,對吧?”

“是的。”