2014-02-25 33 views
4

在這裏,我具有下面的代碼段:運算符優先級或最大蒙克規則至上爲一元運算符

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將不會編譯,因爲最大蒙克規則。它將變成x = (a++) ++ b,因此編譯錯誤。

是因爲優先操作 ++或因最大適合規則的的x=a+++b上述行爲?

+0

由於最大的蒙克。 – devnull

+0

@devnull,是在JVM規範還是在JLS中提到的,或者你有關於這個的任何解釋嗎? – Zeeshan

+0

不應該是3? a = 1,b = 1,那麼你做(a ++)+ b =(1 + 1)+1這是3? – CodeChimp

回答

7

Lexical Translations引用:

的最長的可能翻譯在每個步驟中使用,即使 結果不會最終生成正確的程序,而另一個 詞法翻譯會。

因此,輸入字符一個 - B是記號化(§3.5)作爲一個-b, 這是不任何語法正確的方案的一部分,即使 標記化一個--b可能是一個語法正確 計劃的一部分。

這可以解釋爲什麼

x=a+++b 

被解析爲

x=(a++)+b 

在另一方面,a++++b標記化作爲A ++++b這會導致錯誤。

+3

你好,你可以留下一張紙條,以便提高答案嗎? – devnull

0

只有當「++」左邊有一個變量時,纔會識別一元運算符「++」。當你編寫+++ b時,第三個加號是二元運算符「add」,而第一個運算符(++)是「加1變量」。當你寫「a ++++」時,事情就會失敗,因爲這就像寫作a<unary increment variable by 1> <add> <add>並且第一個操作符缺少一個參數。第二對加號不被識別爲「增量變量」,因爲(a ++)不是變量。

現在有趣的是,Java編譯器當前確實需要空格正確識別

z = a++ + ++b; // this works 
z = a+++++b; // this fails 

作爲一個老的編譯器的作家,我希望這兩個結構應該語法評爲相同(承認這兩個一元運算符++ ++和

0

Maximal munch是一個在詞法分析器中使用的規則,在分析器中運算符的優先級,而詞法分析器在分析器之前概念上運行。因此,x=a+++b變成x=(a++)+b因爲最大適合規則,而不是運算符優先級:

當詞法分析器看到a+++b是將它變成令牌[標識符a] [雙加] [加上] [標識符b]。 [double plus]令牌是由於最大蒙克(取最長匹配,並且+++長)。無論運算符的優先級如何,解析器只能將其轉換爲(a ++)+ b。