int 和字符串的类型转换,java

2022-09-04 05:57:45

最后一次考试,我们进行了练习来确定以下代码的输出:

System.out.println(2 + 3 + ">=" + 1 + 1);

我的答案是,但现在我意识到这是错误的答案。它应该是.但是为什么?5 >= 25 >= 11


答案 1

假设您的语法是:

System.out.println(2 + 3 + ">=" + 1 + 1);

表达式从左到右计算,在这种情况下,2 + 3 求和为 5,当 “添加”到字符串时,结果为 ,当添加到 1 时,再添加 1,您的结果是:"5 >=""5 >= 1""5 >= 11"


答案 2

因为将字符串“添加”到任何内容都会导致串联。以下是在编译阶段对其进行评估的方式:

((((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"