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