下面的語句,級聯字符串的字符和
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
。
差異在哪裏?
下面的語句,級聯字符串的字符和
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
。
差異在哪裏?
由於運算符優先級和字符串轉換的結合,您會看到此行爲。
JLS 15.18.1狀態:
如果只有一個操作數的表達是字符串類型,那麼字符串的轉換(§5.1.11)形成在另一個操作數執行,以產生在運行時的字符串。
因此在第一表達式右手操作數被隱式轉換爲字符串:string = string + ((char)65) + 5;
對於第二個表達式然而string += ((char)65) + 5;
的+=
化合物賦值運算符具有+
一起被考慮。由於+=
比+
弱,因此首先對+
運算符進行評估。在那裏,我們有一個char
和一個int這導致binary numeric promotion到int
。只有+=
被評估,但此時涉及+
運算符的表達式的結果已經被評估。
案例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
那麼,它是否必須對運算符優先級做些什麼? – Tiny
是,操作始終根據操作員優先級執行。 + =這些類型的操作符在完成右側評估後得到解決。 –
當你寫:
string = string + ((char)65) + 5;
它像寫作:
String string =
new StringBuilder(string).append((char)65).append((int)5).toString();
哪個像附加string
到A
和5
(十進制65的焦炭表示)。
在後者,你首先計算右手,然後把結果加到string
,它就像寫:
string = string + 70;
string = string +((char)65) + 5;
這意味着「設置字符串的string
串聯, ((char)65)
和5
「。這會從左到右(因此第一string + ((char)65)
,則該+5
,和一個字符串的級聯評價和一個整數,整數轉換爲字符串。
string += ((char)65) + 5;
這意味着「計算的((char)65)+5
結果,並添加它的字符串「 - 在將結果添加到字符串之前對整個右側進行求值。由於char
實際上只是一個16位整數,因此它們將它們作爲整數相加 - 給出70 - 然後將它附加到string
。
這是相同的情況下的例子:
System.out.println("abc"+10 + 5);
產生abc105(添加作爲字符串)
和
System.out.println(5 + 10);
產生15(添加作爲數)
包含在(操作的第一位)的String
強制所有要處理的元素d執行操作時作爲Strings
。但是,對於+=
,由於運算符的優先級,該操作首先在右側執行(將元素視爲int
),然後與String
連接。
+1。詳細和來源的答案。 – Maroun
應該投入更高 –
@格雷你是對的,謝謝。固定。 –