簡體   English   中英

遞減/遞增運算符的Java表達式解釋規則

[英]Java expression interpretation rules of decrement/increment operators

這是一個純粹的理論問題,為了清楚起見,我不會正常編寫這段代碼。

為什么這個含糊不清的陳述是合法的

int a = 1, b = 2;
int c = a---b; // a=0, b=2, c=-1

(它被解釋為a-- -b

而這個不是?

int c = a-----b;

第一條語句可以被解釋為a- --b ,而第二條語句顯然只有1這將是合乎邏輯的解釋a-- - --b

還有一個好奇的:

int c = a--- -b; // a=0, b=2, c=3

(和int c = a----b; 不是法律聲明)

如何在Java中定義表達式解釋? 我試過搜索JLS,但沒有找到答案。

要回答這個問題,我們必須先看看Javas 運算符的優先級

這個例子的重要規則是:

  • 表達式從左到右進行評估
  • expr-- Postfix運算符具有比ab加法運算符更高的優先級。

因此,表達式a-----b將如下評估: ((a--)--)-b非法的

您可以通過在語句中使用大括號來繞過這些規則: (a--)-(--b)將是一個法律聲明。

介紹

要正確理解這一點,需要認識到所有現代編譯器都有兩個級別來識別源語言,詞匯級別和句法級別。

詞法級別(“詞法分析器”)將源代碼拆分為標記 :文字(字符串/數字/字符),運算符,標識符和詞法語法的其他元素。 這些是編程語言的“單詞”和“標點符號”。

語法級別(“解析器”)涉及將這些低級詞匯標記解釋為語法,通常由語法樹表示。

詞法分析器是需要知道令牌是“減號”令牌( - )還是“減量”( -- )令牌的級別。 (減去令牌是一元還是二進制減去,或者遞減令牌是一個帖子還是預遞減令牌是在句法層面確定的)

像優先級,從左到右,從右到左的東西只存在於句法層面。 但是a---ba -- - b還是a - -- b是在詞匯層面確定的。

回答

為什么a---b成為a -- - bJava語言規范第3.2節“詞匯翻譯”中描述

每個步驟都使用盡可能的翻譯, 即使結果最終沒有制作正確的程序,而另一個詞匯翻譯也是如此。

因此形成了最長的詞匯標記。

a---b的情況下,它使令牌a-- (最長)然后是唯一可能的下一個令牌-然后b

a-----b的情況下,它將被翻譯成a-----b ,這在語法上是無效的。

進一步引用:

詞匯翻譯過程分為3個步驟,在這種情況下,上述情況適用於本案例中的步驟3:

使用以下三個詞匯翻譯步驟將原始Unicode字符流轉換為一系列標記,這些步驟依次應用:

  1. 將Unicode字符的原始流中的Unicode轉義(第3.3節)轉換為相應的Unicode字符。 形式為\\ uxxxx的Unicode轉義,其中xxxx是十六進制值,表示編碼為xxxx的UTF-16代碼單元。 此轉換步驟允許使用僅ASCII字符表示任何程序。

  2. 將步驟1生成的Unicode流轉換為輸入字符和行終止符流(§3.4)。

  3. 將步驟2產生的輸入字符和行終止符流轉換為輸入元素序列(第3.5節),在丟棄空白(§3.6)和注釋(§3.7)之后,構成令牌(§3.5)這是句法語法的終點符號(§2.3)。

(“輸入元素”是“令牌”)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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