输入int和string的转换,java
最后一次考试我们进行了练习,以确定以下代码的输出:
System.out.println(2 + 3 + ">=" + 1 + 1);
我的答案是5 >= 2
但现在我意识到这是错误的答案。 它应该是5 >= 11
。 但为什么?
假设你的语法是:
System.out.println(2 + 3 + ">=" + 1 + 1);
表达式从左到右进行计算,在这种情况下,2 + 3总和为5,当“添加”到字符串时,结果为"5 >="
,当加到1时给出"5 >= 1"
,再添加1你的结果是: "5 >= 11"
因为将“字符串”添加到任何内容会导致连接。 以下是在编译阶段评估它的方式:
((((2 + 3) + ">=") + 1) + 1)
编译器将执行常量折叠,因此编译器实际上可以一次减少一个表达式,并替换为常量表达式。 但是,即使它没有这样做,运行时路径实际上也是一样的。 所以你走了:
((((2 + 3) + ">=") + 1) + 1) // original (((5 + ">=") + 1) + 1) // step 1: addition (int + int) (("5>=" + 1) + 1) // step 2: concatenation (int + String) ("5>=1" + 1) // step 3: concatenation (String + int) "5>=11" // step 4: concatenation (String + int)
您可以通过用括号括起第二个数字加法表达式来强制整数加法。 例如:
System.out.println(2 + 3 + ">=" + 1 + 1); // "5>=11" System.out.println(2 + 3 + ">=" + (1 + 1)); // "5>=2"
Number+number=number number+string=string string+number=string etc.
它从左到右进行评估。 您将"1"
连接到"5 >="
,最后将"1"
到"5 >= 1"
。
让我们从左到右一次读取一个令牌:
遇到的第一个文字是一个整数, 2
,然后是+
,然后是另一个整数, 3
。 两个整数之间的A +
是加法,因此将它们加在一起为5
。
现在我们有5
,一个整数,然后是+
,然后是一个字符串">="
。 整数和字符串之间的A +
是连接运算符。 因此,字符串组合形成"5>="
。
然后我们有"5>="
,一个字符串,一个+
,然后是一个整数, 1
。 这又是String连接。 结果是"5>=1"
。
最后我们有"5>=1"
,一个字符串,一个+
,和一个1
。 他的字符串连接再次出现。 结果是"5>=11"
。