以下陈述,
String string = "string";
string = string +((char)65) + 5;
System.out.println(string);
生成输出stringA5
。
以下,
String string = "string";
string += ((char)65) + 5;
System.out.println(string);
制作string70
。
区别在哪里?
答案 0 :(得分:70)
作为运算符优先级和字符串转换组合的结果,您会看到此行为。
如果只有一个操作数表达式是String类型,则在另一个操作数上执行字符串转换(第5.1.11节)以在运行时生成字符串。
因此,第一个表达式中的右手操作数会隐式转换为字符串:string = string + ((char)65) + 5;
对于第二个表达式string += ((char)65) + 5;
,+=
复合赋值运算符必须与+
一起考虑。由于+=
弱于+
,因此首先评估+
运算符。我们有一个char
和一个 int ,结果是binary numeric promotion到int
。仅评估+=
,但此时已经评估了涉及+
运算符的表达式的结果。
答案 1 :(得分:16)
案例1
string = string +((char)65) + 5;
所有内容都被视为字符串,但在第二种情况下
执行的操作顺序:
string +((char)65 = stringA
stringA + 5 = stringA5
案例2
string += ((char)65) + 5;
计算第一个右侧意味着第一个操作将类似((char)65) + 5
,因此((char)65) + 5 is 70
的结果和之后的操作+ =操作。
执行的操作顺序:
(char)65 + 5 = 70
string + 70 = string70
让我们再看一个例子
String string = "string";
string += ((char)65) + 5 + "A";
System.out.println(string);
输出 string70A
<强>原因强> 计算相同的第一右侧并且执行的操作的序列是
(char)65 + 5 = 70
70 + "A" = 70A
string + 70A = string70A
答案 2 :(得分:5)
当你写:
string = string + ((char)65) + 5;
就像写作:
String string =
new StringBuilder(string).append((char)65).append((int)5).toString();
这就像将string
附加到A
(十进制65的字符表示)和5
。
在后者中,您首先计算右手,然后将结果添加到string
,这就像写作:
string = string + 70;
答案 3 :(得分:3)
string = string +((char)65) + 5;
这意味着“将字符串设置为string
,((char)65)
和5
的串联。”这将从左到右进行评估(首先是string + ((char)65)
,然后是+5
,并且字符串和整数的连接将该整数转换为字符串。
string += ((char)65) + 5;
这意味着“计算((char)65)+5
的结果并将其添加到字符串” - 在将结果添加到字符串之前评估整个右侧。由于char
实际上只是一个16位整数,因此它将它们作为整数相加 - 得到70 - 然后将其附加到string
。
答案 4 :(得分:0)
与示例相同:
System.out.println("abc"+10 + 5);
生成abc105(add as String)
和
System.out.println(5 + 10);
生成15(添加为数字)
操作的(第一位)中包含的String
强制所有元素在执行操作时被视为Strings
。但是在+=
的情况下,由于运算符优先级,操作首先在右侧部分执行(将元素视为int
),然后与String
连接。