[英]Operators precedence in Java gets confusing
我在幾周前提出了類似的問題,但是我仍然無法消除對Java運算符優先級的歧義和困惑。 這次我有這段代碼:
int mask = 0;
int count = 0;
if( ((5<7) || (++count < 10)) | mask++ < 10 )
mask = mask + 1;
System.out.println(mask + " " + count);
結果是(對我來說是意外):2 0。
此外,編譯器會提供警告,僅在表達式(++ count <10)下划線:無效代碼。
我認為代碼的執行雖然是以下一種方式:
1)| 具有比||更高的優先級,因此可以認為該表達式周圍有括號((++ count <10)| mask ++ <10)。 這樣,編譯器應已執行了這兩個部分,並且計數應已設置為1(++ count <10)。
2)如果編譯器首先查看(5 <7),然后將其評估為false,則跳過整個第二個表達式,則不應增加mask,我們將在輸出中等待值1。
我誤解了什么,無法解釋編譯器的行為以及輸出?
||
是一個OR
運算符,僅在左側表達式為false時才求值其右側表達式。 在您的情況下, 5 < 7
為真,而++count < 10
不被評估。
另一方面, |
總是對兩個表達式求值:即使((5<7) || (++count < 10))
為true,也會對mask++ < 10
求值。
| 的優先級高於||,因此可以認為表達式((++ count <10)| mask ++ <10)周圍帶有括號。
您的代碼中沒有這樣的表達式。 再看一遍。 整個表達式是( ((5<7) || (++count < 10)) | mask++ < 10 )
。 ||
將常量測試5<7
與++count < 10
關聯,因為常量測試始終為false,所以永遠不能執行++count < 10
|
將所有這些與mask++ < 10
相關聯。
實際上,這里根本沒有運算符優先級問題,只是您自己對放在括號中的位置的誤解。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.