簡體   English   中英

Java中的運算符優先級令人困惑

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM