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

时间:2014-01-23 08:09:11

标签: java operator-precedence

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

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

更多示例会有所帮助。

5 个答案:

答案 0 :(得分:7)

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

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

System.out.println(new StringBuilder("Result").append(2).append(3).append(4));
System.out.println(new StringBuilder("Result").append(2).append(3 * 5));

编辑完整性:

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

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

int x = 5;
System.out.println("Result"+2+x);

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

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

答案 1 :(得分:5)

这是因为*的优先级高于+

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

  1. 3*5的计算结果为15,然后是
  2. 连接完成。
  3. 所以你得到215

    Operator precedence

答案 2 :(得分:1)

System.out.println("Result"+2+3+4) yields Result234 
Reason : "Result" + "2" +"3" +"4"  // "+" is concatenation operator here


but System.out.println("Result"+2+3*5) returns Result215
Reason : "Result" +"2" +(3*5) / '*' priority is more than that of '+'.
          "Result"+"2"+"15"
          "Result215"

  System.out.println(2+3+4);
  O/P : 9 (2,3 and 4 are parsed as integers..) 

答案 3 :(得分:1)

与普通数学一样,对中缀符号的执行有一些排序。在学校我学习了BIDMAS或BODMAS(取决于谁在教它),尽管你也可能知道PEDMAS。 Java遵循与中缀符号相同的执行顺序作为数学(参见此refference)。

这意味着*符号在+符号之前进行评估,因为它具有更高的优先级(或者在技术上对编程更准确,优先级更高)。使用中缀表示法时,java通常使用第一个元素的类型作为输出的类型,因此a + b将生成与a相同类型的结果。这样,这就是你用第一个例子得到字符串连接的原因。

当java评估时,它会将中缀符号分组成对,并使用相同的规则:

System.out.println("Result"+2+3*5)

变为:

System.out.println((("Result"+2)+(3*5)))

如果你仔细注意我放入的括号,你可以很清楚地看到执行的顺序。 "Result"2的串联首先完成,或35的相乘 - 无论哪种方式都不会影响结果。在此之后,Result215连接。

例如,如果您想强制执行顺序,那么括号将统治所有其他顺序,以便您可以通过以下括号添加第一个示例输出Result9

System.out.println("Result"+(2+3+4))

然而,最安全的做法是使用括号,这样就不会出现评价顺序的差异。

有关Operator Precedence的完整指南,您可以在Operators

上查看Java文档

答案 4 :(得分:0)

这是因为println参数以字符串开头,所以它开始将参数的其余部分连接成一个字符串。但由于'*'的优先级高于'+',因此它会在将其乘以字符串的其余部分之前评估乘法。这就是为什么你得到215。

如果你尝试过

System.out.println(2+3*5);

然后结果将是17。