“嗨,阿米戈!”
“現在我們要上一堂關於邏輯運算符的小課。”
“你知道哪些邏輯運算符?”
— 或 (||)、與 (&&)、非 (!)
“是的。幹得好。你還記得它們是如何工作的嗎?”
“是的。”
“當至少有一個操作數為真時,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 (&&)。因此,整個表達式將被認為是假的,第二部分將不是必需的。”
“正是。這是一個很好的技術,對吧?”
“是的。”
GO TO FULL VERSION