2012-02-07 78 views
8

誰能解釋這樣對我,奇怪行爲的Java + =操作

String str = "Hello"; 

str += ((char)97) +2; // str = "Hello99"; 

str = str +((char)97)+2; // str = "Helloa2"; 

請問+=運營商首先評估右側,然後將其與左側拼接呢?

回答

11

區別在於操作順序。以下:

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首先評估。結果是int99),它被轉換爲字符串並附加到str。結果是"Hello99"

2)str = (str + ((char)97)) + 2

這裏,(char)97'a')被附加到字符串,然後2轉換爲字符串,並添加到結果。這給了"Helloa2"

2

這是關於操作員的關聯性。

str += ((char)97) +2; 

將轉化:

str = str + (((char)97)+2); 
1

你的第一行是等同於:

str = str + ((char)97) + 2); 

,而你的第二個等價於:

str = (str + ((char)97)) + 2 
1
str = str +((char)97)+2 

因爲首先是字符串「+」操作符被用作字符串的concat(其它值被轉換爲字符串)

str +=((char)97)+2 

第一右側被評估爲99(兩項字節之和)比STR + 99 - >串concat

5

是的。 JLS的相關部分如下:http://java.sun.com/docs/books/jls/first_edition/html/15.doc.html#5304

在運行時,表達式以兩種方式之一進行評估。如果 左邊的操作數的表達不是數組訪問表達式,需要然後 四個步驟:

  • 首先,左邊的操作數進行評估,以 產生可變。如果此評估突然完成,則由於同樣的原因 賦值表達式會突然完成; 右側操作數未被評估,也沒有分配發生。
  • 否則,保存左側操作數的值,然後, 右側操作數被評估爲。如果此評估突然完成 ,則分配表達式將以相同的原因突然完成並且不會發生分配。
  • 否則,的 左側變量保存的值與右邊的操作數的值被 用於執行由所述化合物 賦值操作符指示的二進制運算。如果此操作突然完成(唯一的 可能性是零除整數除以參見第15.16.2節),則由於同樣的原因 賦值表達式會突然完成,並且不會發生 賦值。
  • 否則,二進制運算的結果是 轉換爲左側變量的類型,並將 轉換的結果存儲到變量中。

(由我的重點。)