![](/img/trans.png)
[英]Java (Implicit type casting): Does a unary operator affect the data type of the variables in operation?
[英]How does different spacing affect the unary operator?
誰能解釋我不同的間距如何影響一元算子?
int i = 1;
int j = i+ + +i; // this will print j=2
int k = i++ +i; // this will print k=3
int l = i+++i; // this will print l=3
int m = i++++i; // compile time error
。
首先,讓我們把它分成三個不能互動的獨立案例:
int i = 1;
System.out.println(i+ + +i); // 2
int j = 1;
System.out.println(j++ +j); // 3
int k = 1;
System.out.println(k+++k); // 3
現在讓我們用括號重寫它們:
int i = 1;
System.out.println(i + (+(+i)));
int j = 1;
System.out.println((j++) + j);
int k = 1;
System.out.println((k++) + k);
這里我們不能使用前綴或后綴++運算符,因為我們在任何地方都沒有++
的標記。 相反,我們有一個二元+運算符和兩個一元+運算符。
這個很簡單:它幾乎就像它讀取的那樣,一個后綴++運算符后跟一個二元+運算符(而不是+j
可能另外暗示的一元+運算符)。
最后一行被解析為(k++) + k
而不是k + (++k)
。 在這種情況下,兩者都會給出相同的答案,但我們可以通過使用兩個不同的變量來證明哪個是:
int k1 = 1;
int k2 = 1;
System.out.println(k1+++k2); // Prints 2
System.out.println(k1); // Prints 2
System.out.println(k2); // Prints 1
正如你所看到的,它是k1
增加而不是k2
。
將k+++k
解析為k
, ++
, +
, k
標記的原因是由於JLS的第3.2節 ,其中包括:
每個步驟都使用盡可能長的翻譯,即使結果最終沒有制作正確的程序,而另一個詞匯翻譯也是如此。
相同的“盡可能長的翻譯”規則將i++++i
解析為i
, ++
, ++
, i
,它不是有效的表達式(因為++
操作的結果是值,而不是變量)。
+
是一個運算符, ++
是一個運算符,但+ +
不是 - + +
被解釋為兩個+
s,而不是一個++
。 因此,空間強制您的代碼被不同地解釋。
+
是這兩者將兩個數相加和一元運算符,它不改變一個數字(它僅在與所述一元一致性的二進制運算符-
操作者)。
如果我們使用add
而不是binary +
, no-change
而不是unary +
,並且increment
而不是++
那么它可能會更清楚。
int j=i+ + +i
變為int j = i add no-change no-change i;
。
int k=i++ +i;
變成int k=i increment add i;
。
我懷疑int k = i+++i;
也變成int k = i increment add i;
但我沒有用語言規范來檢查這一點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.