如何在此方法中评估表达式。
例如System.out.println("Result"+2+3+4)
产生Result234
但System.out.println("Result"+2+3*5)
返回Result215
我理解表达式是从左到右计算的,如果一个操作数是String,那么结果将是String。对于上面的第二个例子,它是有道理的。但是例如上面的例子1结果不应该是Result27?
更多示例会有所帮助。
答案 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)
3*5
的计算结果为15
,然后是所以你得到215
答案 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
的串联首先完成,或3
和5
的相乘 - 无论哪种方式都不会影响结果。在此之后,Result2
与15
连接。
例如,如果您想强制执行顺序,那么括号将统治所有其他顺序,以便您可以通过以下括号添加第一个示例输出Result9
:
System.out.println("Result"+(2+3+4))
然而,最安全的做法是使用括号,这样就不会出现评价顺序的差异。
有关Operator Precedence的完整指南,您可以在Operators
上查看Java文档答案 4 :(得分:0)
这是因为println参数以字符串开头,所以它开始将参数的其余部分连接成一个字符串。但由于'*'的优先级高于'+',因此它会在将其乘以字符串的其余部分之前评估乘法。这就是为什么你得到215。
如果你尝试过
System.out.println(2+3*5);
然后结果将是17。