簡體   English   中英

不同的間距如何影響一元算子?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM