2013-12-11 44 views
55

下面的语句,级联字符串的字符和

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

差异在哪里?

回答

69

由于运算符优先级和字符串转换的结合,您会看到此行为。

JLS 15.18.1状态:

如果只有一个操作数的表达是字符串类型,那么字符串的转换(§5.1.11)形成在另一个操作数执行,以产生在运行时的字符串。

因此在第一表达式右手操作数被隐式转换为字符串:string = string + ((char)65) + 5;

对于第二个表达式然而string += ((char)65) + 5;+=化合物赋值运算符具有+一起被考虑。由于+=+弱,因此首先对+运算符进行评估。在那里,我们有一个char和一个int这导致binary numeric promotionint。只有+=被评估,但此时涉及+运算符的表达式的结果已经被评估。

+1

+1。详细和来源的答案。 – Maroun

+2

应该投入更高 –

+0

@格雷你是对的,谢谢。固定。 –

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

让我们看看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
+1

那么,它是否必须对运算符优先级做些什么? – Tiny

+0

是,操作始终根据操作员优先级执行。 + =这些类型的操作符在完成右侧评估后得到解决。 –

5

当你写:

string = string + ((char)65) + 5; 

它像写作:

String string = 
    new StringBuilder(string).append((char)65).append((int)5).toString(); 

哪个像附加stringA5(十进制65的焦炭表示)。

在后者,你首先计算右手,然后把结果加到string,它就像写:

string = string + 70; 
2
string = string +((char)65) + 5; 

这意味着“设置字符串的string串联, ((char)65)5“。这会从左到右(因此第一string + ((char)65),则该+5,和一个字符串的级联评价和一个整数,整数转换为字符串。

string += ((char)65) + 5; 

这意味着“计算的((char)65)+5结果,并添加它的字符串“ - 在将结果添加到字符串之前对整个右侧进行求值。由于char实际上只是一个16位整数,因此它们将它们作为整数相加 - 给出70 - 然后将它附加到string

0

这是相同的情况下的例子:

System.out.println("abc"+10 + 5); 

产生abc105(添加作为字符串)

System.out.println(5 + 10); 

产生15(添加作为数)

包含在(操作的第一位)的String强制所有要处理的元素d执行操作时作为Strings。但是,对于+=,由于运算符的优先级,该操作首先在右侧执行(将元素视为int),然后与String连接。