2013-12-11 48 views
55

下面的語句,級聯字符串的字符和

String string = "string"; 

string = string +((char)65) + 5; 
System.out.println(string); 

產生輸出stringA5


但是下面,

String string = "string"; 

string += ((char)65) + 5; 
System.out.println(string); 

生產string70

差異在哪裏?

回答

69

由於運算符優先級和字符串轉換的結合,您會看到此行爲。

JLS 15.18.1狀態:

如果只有一個操作數的表達是字符串類型,那麼字符串的轉換(§5.1.11)形成在另一個操作數執行,以產生在運行時的字符串。

因此在第一表達式右手操作數被隱式轉換爲字符串:string = string + ((char)65) + 5;

對於第二個表達式然而string += ((char)65) + 5;+=化合物賦值運算符具有+一起被考慮。由於+=+弱,因此首先對+運算符進行評估。在那裏,我們有一個char和一個int這導致binary numeric promotionint。只有+=被評估,但此時涉及+運算符的表達式的結果已經被評估。

+1

+1。詳細和來源的答案。 – Maroun

+2

應該投入更高 –

+0

@格雷你是對的,謝謝。固定。 –

16

案例1

string = string +((char)65) + 5; 

一切被當作字符串但在第二種情況下

序列動作執行的:

  • string +((char)65 = stringA
  • stringA + 5 = stringA5

案例2

string += ((char)65) + 5; 

第一右側計算裝置第一操作會像((char)65) + 5,所以((char)65) + 5 is 70導致和+ =操作之後。

序列動作執行的:

  • (char)65 + 5 = 70
  • string + 70 = string70

讓我們看看1多個示例

String string = "string"; 
string += ((char)65) + 5 + "A"; 
System.out.println(string); 

輸出 string70A

原因 相同的第一右手邊是計算和執行opertion的sequesce是

  • (char)65 + 5 = 70
  • 70 + "A" = 70A
  • string + 70A = string70A
+1

那麼,它是否必須對運算符優先級做些什麼? – Tiny

+0

是,操作始終根據操作員優先級執行。 + =這些類型的操作符在完成右側評估後得到解決。 –

5

當你寫:

string = string + ((char)65) + 5; 

它像寫作:

String string = 
    new StringBuilder(string).append((char)65).append((int)5).toString(); 

哪個像附加stringA5(十進制65的焦炭表示)。

在後者,你首先計算右手,然後把結果加到string,它就像寫:

string = string + 70; 
2
string = string +((char)65) + 5; 

這意味着「設置字符串的string串聯, ((char)65)5「。這會從左到右(因此第一string + ((char)65),則該+5,和一個字符串的級聯評價和一個整數,整數轉換爲字符串。

string += ((char)65) + 5; 

這意味着「計算的((char)65)+5結果,並添加它的字符串「 - 在將結果添加到字符串之前對整個右側進行求值。由於char實際上只是一個16位整數,因此它們將它們作爲整數相加 - 給出70 - 然後將它附加到string

0

這是相同的情況下的例子:

System.out.println("abc"+10 + 5); 

產生abc105(添加作爲字符串)

System.out.println(5 + 10); 

產生15(添加作爲數)

包含在(操作的第一位)的String強制所有要處理的元素d執行操作時作爲Strings。但是,對於+=,由於運算符的優先級,該操作首先在右側執行(將元素視爲int),然後與String連接。