[英]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---b
是a -- - b
還是a - -- b
是在詞匯層面確定的。
為什么a---b
成為a -- - b
在Java語言規范第3.2節“詞匯翻譯”中描述 :
每個步驟都使用盡可能長的翻譯, 即使結果最終沒有制作正確的程序,而另一個詞匯翻譯也是如此。
因此形成了最長的詞匯標記。
在a---b
的情況下,它使令牌a
, --
(最長)然后是唯一可能的下一個令牌-
然后b
。
在a-----b
的情況下,它將被翻譯成a
, --
, --
, -
, b
,這在語法上是無效的。
進一步引用:
詞匯翻譯過程分為3個步驟,在這種情況下,上述情況適用於本案例中的步驟3:
使用以下三個詞匯翻譯步驟將原始Unicode字符流轉換為一系列標記,這些步驟依次應用:
將Unicode字符的原始流中的Unicode轉義(第3.3節)轉換為相應的Unicode字符。 形式為\\ uxxxx的Unicode轉義,其中xxxx是十六進制值,表示編碼為xxxx的UTF-16代碼單元。 此轉換步驟允許使用僅ASCII字符表示任何程序。
將步驟1生成的Unicode流轉換為輸入字符和行終止符流(§3.4)。
將步驟2產生的輸入字符和行終止符流轉換為輸入元素序列(第3.5節),在丟棄空白(§3.6)和注釋(§3.7)之后,構成令牌(§3.5)這是句法語法的終點符號(§2.3)。
(“輸入元素”是“令牌”)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.