奇怪的行为Java + =运算符

时间:2012-02-07 18:12:43

标签: java operator-keyword

任何人都可以向我解释这个,

String str = "Hello";

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

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

+=运算符首先评估右侧然后将它与左侧连接起来吗?

5 个答案:

答案 0 :(得分: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"

答案 1 :(得分:5)

是。 JLS的相关部分位于:http://java.sun.com/docs/books/jls/first_edition/html/15.doc.html#5304

  

在运行时,表达式以两种方式之一进行评估。如果   那么左手操作数表达式不是数组访问表达式   需要四个步骤:

     
      
  • 首先,评估左侧操作数   产生一个变量。如果这个评估突然完成,那么   由于同样的原因,赋值表达式突然完成;该   不评估右侧操作数,也不进行任何分配。
  •   
  • 否则,保存左侧操作数的值,然后   评估右侧操作数。如果此评估完成   然后突然完成赋值表达式   同样的原因,没有任何转让。
  •   
  • 否则,保存的值   左手变量和右手操作数的值是   用于执行化合物指示的二元操作   赋值运算符。如果此操作突然完成(唯一的   可能性是零整数除 - 见§15.16.2),然后是   赋值表达式出于同样的原因突然完成,没有   分配发生。
  •   
  • 否则,二进制操作的结果是   转换为左手变量的类型和结果   转换存储在变量中。
  •   

(我强调。)

答案 2 :(得分:2)

这完全是关于运营商关联性的。

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

会转换为:

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

答案 3 :(得分:1)

您的第一行相当于:

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

而你的第二个相当于:

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

答案 4 :(得分:1)

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

因为first是字符串'+'运算符用作字符串concat(其他值转换为字符串)

str +=((char)97)+2

第一个右侧被评估为99(两个字节的总和)而不是str + 99 - > string concat