字符串+ int的表达式评估顺序

Anu*_*jee 2 java operator-precedence

如何在此方法中评估表达式.例如,System.out.println("Result"+2+3+4)产生Result234但System.out.println("Result"+2+3*5)返回Result215

我理解表达式是从左到右计算的,如果一个操作数是String,那么结果将是String.对于上面的第二个例子,它是有道理的.但是例如上面的例子1结果不应该是Result27?

更多示例将有所帮助.

Bri*_*ach 7

String连接运算符(+)触发了对int值的String转换的需要,因为左边的第一个参数是String.在评估连接运算符之前,优先顺序使得两个整数的乘法在第二个示例中首先出现.

我需要检查字节码,但我相信编译器使用了StringBuilder这里,所以真正的代码看起来像:

System.out.println(new StringBuilder("Result").append(2).append(3).append(4));
System.out.println(new StringBuilder("Result").append(2).append(3 * 5));
Run Code Online (Sandbox Code Playgroud)

编辑完整性:

您的示例,因为它们完全由文字(字符串和基元)组成,在编译时处理,并简单地转换为字符串文字.这是编译时间常量表达式.优先权仍然适用,因此结果是相同的.

如果其中任何一个是变量,例如:

int x = 5;
System.out.println("Result"+2+x);
Run Code Online (Sandbox Code Playgroud)

然后StringBuilder在运行时使用a 将文字部分与变量的值连接起来.

(在查看字节码和JLS后编辑为权威)


Spr*_*ner 5

发生这种情况是因为*优先级高于+

所以在这: System.out.println("Result"+2+3*5)

  1. 3*5计算结果15然后
  2. 连接完成.

所以你得到了 215

运算符优先级