誰能解釋或給予理解這個例子很好的借鑑: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
感謝。
誰能解釋或給予理解這個例子很好的借鑑: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
感謝。
表達式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
可能是一個語法正確的程序的一部分。
優秀的答案! – AlcubierreDrive 2010-11-01 09:17:46
-
和--
是一元運算符。因此不能與兩個操作數一起使用。這就是爲什麼
System.out.println(a--b);
是錯誤的。 --
適用於a
,所以a
的新值爲0
。如果你添加一個-
,那麼a
由1
遞減值將通過b
值產生-2
這不只是標記化減去。您還需要了解解析。 – EJP 2010-11-01 09:11:49