誰能解釋這樣對我,奇怪行爲的Java + =操作
String str = "Hello";
str += ((char)97) +2; // str = "Hello99";
str = str +((char)97)+2; // str = "Helloa2";
請問+=
運營商首先評估右側,然後將其與左側拼接呢?
誰能解釋這樣對我,奇怪行爲的Java + =操作
String str = "Hello";
str += ((char)97) +2; // str = "Hello99";
str = str +((char)97)+2; // str = "Helloa2";
請問+=
運營商首先評估右側,然後將其與左側拼接呢?
區別在於操作順序。以下:
str += ((char)97) +2;
等同於:
str = str + (((char)97) + 2);
在另一方面,以下內容:
str = str +((char)97)+2;
等同於:
str = (str + ((char)97)) + 2;
注意區別放置括號。
現在讓我們考慮兩種情況:
1)str = str + (((char)97) + 2)
:
這裏,97 + 2
首先評估。結果是int
(99
),它被轉換爲字符串並附加到str
。結果是"Hello99"
。
2)str = (str + ((char)97)) + 2
:
這裏,(char)97
('a'
)被附加到字符串,然後2
轉換爲字符串,並添加到結果。這給了"Helloa2"
。
這是關於操作員的關聯性。
str += ((char)97) +2;
將轉化:
str = str + (((char)97)+2);
你的第一行是等同於:
str = str + ((char)97) + 2);
,而你的第二個等價於:
str = (str + ((char)97)) + 2
str = str +((char)97)+2
因爲首先是字符串「+」操作符被用作字符串的concat(其它值被轉換爲字符串)
str +=((char)97)+2
第一右側被評估爲99(兩項字節之和)比STR + 99 - >串concat
是的。 JLS的相關部分如下:http://java.sun.com/docs/books/jls/first_edition/html/15.doc.html#5304
在運行時,表達式以兩種方式之一進行評估。如果 左邊的操作數的表達不是數組訪問表達式,需要然後 四個步驟:
- 首先,左邊的操作數進行評估,以 產生可變。如果此評估突然完成,則由於同樣的原因 賦值表達式會突然完成; 右側操作數未被評估,也沒有分配發生。
- 否則,保存左側操作數的值,然後, 右側操作數被評估爲。如果此評估突然完成 ,則分配表達式將以相同的原因突然完成並且不會發生分配。
- 否則,的 左側變量保存的值與右邊的操作數的值被 用於執行由所述化合物 賦值操作符指示的二進制運算。如果此操作突然完成(唯一的 可能性是零除整數除以參見第15.16.2節),則由於同樣的原因 賦值表達式會突然完成,並且不會發生 賦值。
- 否則,二進制運算的結果是 轉換爲左側變量的類型,並將 轉換的結果存儲到變量中。
(由我的重點。)