2014-11-14 71 views
-6

我有這樣的代碼,= - 運營商在java中

class Test 
{ 
    public static void main(String args[]) 
    { 
    int a=--4-2*2/9-3;//Line 1 
    System.out.println(a); 
    } 
} 

這是爲什麼在編譯時間--4錯誤?請不要建議我有 - ( - 4)。我只是想弄清楚,爲什麼上面的代碼是一個編譯時錯誤,並且如果我將代碼在第1行更改爲,a = - -4-2 * 2/9-3,則O/p爲1. ie - (-4)。我錯過了一秒鐘,它必須與 - =即a = a-(表達式的其餘部分)相同。它也會給++運算符帶來同樣的錯誤!任何人都可以解釋我嗎?

+2

你希望做什麼? – squiguy 2014-11-14 20:32:20

+1

當你有錯誤/異常時,**始終總是**發佈錯誤和發生的地方。不要浪費每個人的時間,讓我們坐在這裏猜猜! – tnw 2014-11-14 20:33:14

+2

沒有'= -'運算符。 – Jesper 2014-11-14 20:39:11

回答

2

--是Java和許多其他語言中的「遞減」運算符。編譯器不把它當作兩個-運算符的原因是,有一條基本規則,編譯器將查找形成here定義的其中一個「分隔符」或「運算符」的最長連續字符序列。 (>字符是因爲仿製藥的處理方式稍有不同)

JLS 3.2明確指出:

最長可能的翻譯在每個步驟中使用,即使 結果最終並沒有做出正確的程序,而另一個 詞法翻譯會。有一個例外[用於>字符] ...

因此,當編譯器看到--4,它會將其作爲施加到一個4--運營商,這是非法的。它不會回溯並嘗試找到解釋--的其他方法。

但是如果它看到- -4,連字符之間有一個空格,它不能將-解釋爲除個別減號外的其他任何內容。這是合法的,並且與-(-4)具有相同的含義。

8

問題是你正試圖減少一個常量。例如,--var。如果擴大與不變(4)它看起來像

​​

符號而這是沒有意義的

var = var - 1; 

什麼是 「發生」 的模樣。

+1

當心前綴和後綴如何工作,OP:http://stackoverflow.com/questions/5413548/java-prefix-postfix-of-increment-decrement-operators – tnw 2014-11-14 20:34:33

1

您不能在常數值(如4)上使用預先減量運算符「--運算符」。你只能在變量上使用它。

2

閱讀說明書:15.15.2. Prefix Decrement Operator --

一元表達式前面有一個 - 操作者是一個前綴遞減表達式。

一元表達式的結果必須是這樣的類型 即轉換(§5.1.8),以數字類型,或編譯時發生錯誤 的可變

+0

對不起,我總是有理解JLS文檔的問題。它是--4不是一個可轉換類型變量? – Gpar 2014-11-14 21:06:49

+1

4不是一個變量 - 它是常數,或者是「literal」,因爲它們在規範中命名。想一會兒......'while( - 4 <0){doSomething(); },這個循環是否有意義?我如何減少一個常量? – krokodilko 2014-11-14 22:45:16

+0

OH !!!我現在得到你,謝謝。 – Gpar 2014-11-14 23:11:46