更新時間:2022-05-05 11:23:59 來源:動力節點 瀏覽1585次
Java 有明確定義的表達式求值規則,包括運算符優先級、運算符關聯性和操作數求值順序。我們描述了這三個規則中的每一個。
運算符優先級。 Java運算符優先級指定操作數與運算符分組的方式。例如,1 + 2 * 3 被視為 1 + (2 * 3),而 1 * 2 + 3 被視為 (1 * 2) + 3,因為乘法運算符的優先級高于加法運算符。您可以使用括號來覆蓋默認的運算符優先規則。
運算符關聯性。 當一個表達式有兩個優先級相同的運算符時,運算符和操作數會根據它們的關聯性進行分組。例如72 / 2 / 3被視為 (72 / 2) / 3因為除法運算符是從左到右的關聯。您可以使用括號來覆蓋默認的運算符關聯性規則。
大多數 Java 運算符都是從左到右關聯的。一個值得注意的例外是賦值運算符,它是從右到左結合的。結果,表達式x = y = z = 17被視為x = (y = (z = 17)),所有三個變量的值都為 17。回想一下,賦值語句的值是它的右-手邊。關聯性與某些運算符無關。例如, x <= y <= z和x++--在 Java 中是無效的表達式。
Java 運算符的優先級和關聯性。 下表顯示了所有 Java 運算符從最高到最低優先級,以及它們的關聯性。大多數程序員不會全部記住它們,即使是那些記住的,為了清楚起見,也使用括號。
等級 | 操作員 | 描述 | 關聯性 |
---|---|---|---|
16 | () [] 。 |
括號 數組訪問 成員訪問 |
左到右 |
15 | ++ -- |
一元后增量 一元后減 |
左到右 |
14 | + - ! ~ ++ -- |
一元加 一元減 一元邏輯非 一元按位非 一元預遞增 一元預遞減 |
右到左 |
13 | () 新的 |
鑄造 對象創建 |
右到左 |
12 | * / % | 乘法的 | 左到右 |
11 | + - + |
附加 字符串連接 |
左到右 |
10 | << >> >>> |
轉移 | 左到右 |
9 | < <= > >= instanceof |
關系 | 左到右 |
8 | == != |
平等 | 左到右 |
7 | & | 按位與 | 左到右 |
6 | ^ | 按位異或 | 左到右 |
5 | | | 按位或 | 左到右 |
4 | && | 邏輯與 | 左到右 |
3 | || | 邏輯或 | 左到右 |
2 | ?: | 三元 | 右到左 |
1 | = += -= *= /= %= &= ^= |= <<= >>= >>>= |
任務 | 右到左 |
0 | -> | lambda 表達式箭頭 | 右到左 |
您會在網絡和教科書中找到不同的(通常是等效的)運算符優先級表。它們通常以無關緊要的方式不同意,因為某些運算符不能共享操作數,因此它們的相對優先順序無關緊要(例如,new和!)。Java 語言規范中沒有明確的運算符優先級表。相反,運算符優先級和關聯性規則是通過定義 Java 語言的語法來推斷的。
Java中操作數求值的順序。 關聯性和優先級決定了 Java 對操作數和運算符的分組順序,但它不決定操作數的計算順序。在 Java 中,運算符的操作數總是從左到右計算。同樣,參數列表總是從左到右計算。因此,例如在表達式 A() + B() * C(D(), E())中,子表達式按A()、B()、 D()、E()和C()。雖然C()出現在D()和E()的左側,但我們需要D()和E()來評估C()。編寫依賴于這種行為的代碼被認為是糟糕的風格(并且不同的編程語言可能使用不同的規則)。
短路評估。 除了三個例外(&&、||和?:),Java 在執行操作之前評估運算符的每個操作數。對于邏輯 AND ( &&) 和邏輯 OR ( ||) 運算符,Java 僅在需要解析結果時才評估第二個操作數。這稱為短路評估。它允許 if ((s != null) && (s.length() < 10))之類的語句可靠地工作(即,僅當 is not時才調用該length()方法)。程序員很少使用帶有布爾表達式的非短路版本(&和|) 。snull
運算符優先級出錯了。 有時,一種語言中定義的優先順序不符合數學規范。例如,在 Microsoft Excel 中, -a^b被視為(-a)^b而不是 -(a^b). 所以-3^2計算結果為 9而不是-9,這是大多數數學家所期望的值。微軟承認這種 怪癖 是一種“設計選擇”。有人想知道程序員是否依賴于 C 優先順序,其中一元運算符的優先級高于二元運算符。此規則與所有 C 運算符的數學約定一致,但由于添加了冪運算符而失敗。一旦在 Microsoft Excel 2.0 中建立了訂單,就很難在不破壞向后兼容性的情況下對其進行更改。
運算符關聯性出錯。 有時,運算符的關聯性在一種編程語言中是從左到右實現的,而在另一種編程語言中是從右到左實現的。一個令人震驚的例子 是求冪。在 Wolfram Alpha 和 Google Sheets 中,取冪運算符是從右到左關聯的,因此2 ^ 2 ^ 3被視為2 ^ (2 ^ 3),即 256。但是,在 Matlab 和 Excel 中,取冪運算符是從左到右關聯的,因此 2 ^ 2 ^ 3被視為(2 ^ 2) ^ 3,即 64。求冪不是 Java 中的二元運算符。
以上就是關于“Java運算符優先級詳解”的介紹,大家如果想了解更多相關知識,可以關注一下動力節點的Java在線學習,里面的課程內容從入門到精通,通俗易懂,比較適合沒有基礎的小伙伴學習,希望對大家能夠有所幫助哦。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習