任何人都可以向我解释这个,
String str = "Hello";
str += ((char)97) +2; // str = "Hello99";
str = str +((char)97)+2; // str = "Helloa2";
+=
运算符首先评估右侧然后将它与左侧连接起来吗?
答案 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
。结果是int
(99
),它将转换为字符串并附加到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