2010-11-01 63 views
4

誰能解釋或給予理解這個例子很好的借鑑:Java。算術運算。怎麼樣?

int a=1; 
int b=2; 
System.out.println(a---b); //correct 
System.out.println(a- -b); //correct 
System.out.println(a--b); //wrong 

感謝。

+0

這不只是標記化減去。您還需要了解解析。 – EJP 2010-11-01 09:11:49

回答

4

表達式a---b不是(如您所預料的那樣)被解析爲a-(-(-b))而是(a--) - b

這個例子說明吧:

int a = 0; 
int b = 0; 
System.out.println(a---b); // prints 0 
System.out.println(a);  // prints -1 

這種行爲一點,a--b被解析爲(a--)b這顯然是一個錯誤。

當您在這些缺陷之間放置空格a- -b時,它不再被解析爲--運算符,而是作爲二進制和一元減號:a - (-b)

請注意,您可以編寫a- - -b,它被解釋爲a-(-(-b))

所以爲什麼是這樣解釋的?那麼@EJP對另一個答案給出了很好的評論。在JLS, section 3.2你可以閱讀以下內容:

最長可能的翻譯在每個步驟中使用,即使結果最終並沒有做出正確的程序,而另一個詞彙翻譯會。因此,輸入的字符a--b是記號化(§3.5)作爲a--b,這是不任何語法正確的方案的一部分,即使該標記化a--b可能是一個語法正確的程序的一部分。

+1

優秀的答案! – AlcubierreDrive 2010-11-01 09:17:46

0
+3

TOC?你真的爲他縮小了... – aioobe 2010-11-01 09:02:30

+0

這是正確的參考。任何程序員都應該能夠圍繞語言規範找到方法。 – EJP 2010-11-01 09:12:50

+0

@EJP,你能告訴我如何在JLS中找到OPs問題的答案嗎?我嘗試失敗了。具體來說,我正在尋找爲什麼'a --- b'被解釋爲'a -b'而不是'a -b -b'或'a --b'的原因。 – aioobe 2010-11-01 09:27:20

0

---是一元運算符。因此不能與兩個操作數一起使用。這就是爲什麼

System.out.println(a--b); 

是錯誤的。 --適用於a,所以a的新值爲0。如果你添加一個-,那麼a1遞減值將通過b值產生-2