奇怪的行为Java + =运算符

con*_*ius 8 java operator-keyword

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

String str = "Hello";

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

str = str +((char)97)+2; // str = "Helloa2";
Run Code Online (Sandbox Code Playgroud)

请问+=符计算右侧第一然后将其与左侧拼接呢?

NPE*_*NPE 11

差异与操作顺序有关.下列:

str += ((char)97) +2; 
Run Code Online (Sandbox Code Playgroud)

相当于:

str = str + (((char)97) + 2);
Run Code Online (Sandbox Code Playgroud)

另一方面,以下内容:

str = str +((char)97)+2;
Run Code Online (Sandbox Code Playgroud)

相当于:

str = (str + ((char)97)) + 2;
Run Code Online (Sandbox Code Playgroud)

请注意括号位置的不同.

现在让我们考虑两种情况:

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

在这里,97 + 2首先进行评估.结果是一个int(99),它被转换为字符串并附加到str.结果是"Hello99".

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

这里,(char)97('a')附加到字符串,然后2转换为字符串并附加到结果.这给了"Helloa2".


Hau*_*idt 5

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

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

  • 首先,评估左侧操作数以产生变量.如果此评估突然完成,则赋值表达式出于同样的原因突然完成; 不评估右侧操作数,也不进行赋值.
  • 否则,保存左侧操作数的值,然后评估右侧操作数.如果此评估突然完成,则赋值表达式会出于同样的原因突然完成,并且不会发生任何分配.
  • 否则,左侧变量的保存值和右侧操作数的值用于执行复合赋值运算符指示的二元运算.如果此操作突然完成(唯一的可能性是整数除以零 - 参见§15.16.2),则赋值表达式会因同样的原因而突然完成,并且不会发生任何赋值.
  • 否则,二进制运算的结果将转换为左侧变量的类型,转换结果将存储到变量中.

(我的重点.)