[英]Operator precedence or Maximal Munch Rule comes first for Unary Operators
在這里,我有以下代碼:
int a,b,x;
a=b=1;
x=a+++b;
現在x
的值將為2,因為a
首先是后遞增 ,然后將其添加到b
。
以下是編譯的字節代碼:
0 iconst_1
1 dup
2 istore_2 [b]
3 istore_1 [a]
4 iload_1 [a]
5 iinc 1 1 [a]
8 iload_2 [b]
9 iadd
10 istore_3 [x]
因此表達式將等效於x = (a++) + b
。
現在另一個表達式x=a++++b
,由於最大的munch規則而無法編譯。 它將成為x = (a++) ++ b
,因此編譯錯誤。
上述x=a+++b
行為是因為運算符 ++的優先級還是因為最大的munch規則 ?
僅當“++”左側有變量時,才會識別一元運算符“++”。 當你寫一個+++ b時,第三個加號是二進制運算符“add”,而第一個運算符(++)是“遞增變量1”。 當你寫“a ++++”時,事情會失敗,因為這就像寫a<unary increment variable by 1> <add> <add>
並且第一個運算符缺少一個參數。 第二對加號不被識別為“增量變量”,因為(a ++)不是變量。
現在有趣的是,Java編譯器當前需要空格才能正確識別
z = a++ + ++b; // this works
z = a+++++b; // this fails
作為一個舊的編譯器編寫器,我希望這兩個結構應該在語法上被評估為相同(識別兩個一元運算符++和++
最大munch是在詞法分析器中使用的規則,解析器中的運算符優先級,並且詞法分析器在解析器之前在概念上運行。 因此, x=a+++b
變成x=(a++)+b
因為最大的munch規則,而不是運算符優先級:
當詞法分析器看到a+++b
會將其轉換為標記[標識符a
] [雙加] [加號] [標識符b
]。 [double plus]令牌是由於最大咬合(采用最長匹配,而++
長於+
)。 然后,無論運算符優先級如何,解析器都只能將其轉換為(a ++)+ b。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.