下面的语句,级联字符串的字符和
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
。
差异在哪里?
下面的语句,级联字符串的字符和
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
。
差异在哪里?
由于运算符优先级和字符串转换的结合,您会看到此行为。
JLS 15.18.1状态:
如果只有一个操作数的表达是字符串类型,那么字符串的转换(§5.1.11)形成在另一个操作数执行,以产生在运行时的字符串。
因此在第一表达式右手操作数被隐式转换为字符串:string = string + ((char)65) + 5;
对于第二个表达式然而string += ((char)65) + 5;
的+=
化合物赋值运算符具有+
一起被考虑。由于+=
比+
弱,因此首先对+
运算符进行评估。在那里,我们有一个char
和一个int这导致binary numeric promotion到int
。只有+=
被评估,但此时涉及+
运算符的表达式的结果已经被评估。
案例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
让我们看看1多个示例
String string = "string";
string += ((char)65) + 5 + "A";
System.out.println(string);
输出 string70A
原因 相同的第一右手边是计算和执行opertion的sequesce是
(char)65 + 5 = 70
70 + "A" = 70A
string + 70A = string70A
那么,它是否必须对运算符优先级做些什么? – Tiny
是,操作始终根据操作员优先级执行。 + =这些类型的操作符在完成右侧评估后得到解决。 –
当你写:
string = string + ((char)65) + 5;
它像写作:
String string =
new StringBuilder(string).append((char)65).append((int)5).toString();
哪个像附加string
到A
和5
(十进制65的焦炭表示)。
在后者,你首先计算右手,然后把结果加到string
,它就像写:
string = string + 70;
string = string +((char)65) + 5;
这意味着“设置字符串的string
串联, ((char)65)
和5
“。这会从左到右(因此第一string + ((char)65)
,则该+5
,和一个字符串的级联评价和一个整数,整数转换为字符串。
string += ((char)65) + 5;
这意味着“计算的((char)65)+5
结果,并添加它的字符串“ - 在将结果添加到字符串之前对整个右侧进行求值。由于char
实际上只是一个16位整数,因此它们将它们作为整数相加 - 给出70 - 然后将它附加到string
。
这是相同的情况下的例子:
System.out.println("abc"+10 + 5);
产生abc105(添加作为字符串)
和
System.out.println(5 + 10);
产生15(添加作为数)
包含在(操作的第一位)的String
强制所有要处理的元素d执行操作时作为Strings
。但是,对于+=
,由于运算符的优先级,该操作首先在右侧执行(将元素视为int
),然后与String
连接。
+1。详细和来源的答案。 – Maroun
应该投入更高 –
@格雷你是对的,谢谢。固定。 –