我有
System.out.println(2+" "+3);
System.out.println(2+' '+3);
第一个输出 2 3,而第二个输出 37,有人能解释一下为什么会输出 37 吗?
我有
System.out.println(2+" "+3);
System.out.println(2+' '+3);
第一个输出 2 3,而第二个输出 37,有人能解释一下为什么会输出 37 吗?
引用Java语言规范中加法运算符的说明:
如果加法运算符的任一操作数的类型为
String
,则执行字符串连接操作。否则,加法运算符的每个操作数的类型必须是可转换(§5.1.8)为原始数字类型的类型
对操作数执行二进制数字提升(§5.6.2)
因此,[...] 否则,将两个操作数都转换为
int
类型。
2 + " " + 3
是字符串拼接,而String + 3
也是字符串拼接,所以2 + " " + 3
等于"2" + " " + "3"
,意思是"2 3"
。
2 + ' ' + 3
是2 + ' '
,空格字面量是char
,所以它被转换为int
(32),2 + 32 + 3
是37
。
// String concatenation
String s = new StringBuilder().append(2).append(" ").append(3).toString();
System.out.println(s);
// Numeric addition
int n = 2 + (int)' ' + 3;
System.out.println(n);
append()
和println()
都是重载的方法,所以它们不是完全相同的方法。
由于它们是字面量而不是变量,编译器会在编译时进行操作,您真正得到的是这个结果(尝试反汇编.class文件以查看):
System.out.println("2 3");
System.out.println(37);
' '=32
在ASCII中代表空格。
a:) System.out.println(2+" "+3); // string concatenation
b:) System.out.println(2+' '+3); // 2+ 32(32 ascii valur for space)+3 so 37
2+ ' ' +3
的整数值,它会将' '
翻译为char
而不是string
,这只是将b)部分转换为其ASCII值,结果为2 + Space的ASCII值 + 3
,最终结果将是37,因为空格的ASCII值为32。在这里的串联几乎是 Java 如此宽容的一种情况。在其他上下文中,使用 char ' ' 和 String " " 表现不同:它们是强类型的。
除非 System.out.println
的输出参数明确为 java.lang.String
,否则 Java 会自动将其作为输出参数给定的任何数据类型和对象转换为 java.lang.String
。
在您的第一个示例中,System.out.println(2+" "+3);
,Java 扫描输出参数并找到一个 int
(2),双引号 " "
,表示双引号内的字符数组应解释为 String
,以及另一个 int
(3)。Java 将字符串 " "
的存在视为提示,表明参数中的其他所有内容也应视为字符串处理。因此,实际发生的是该行 System.out.println(2+" "+3);
被视为您编写了
System.out.println(Integer.toString(2)+" "+Integer.toString(3));
System.out.println(2+' '+3);
发生了同样的过程,但是与其找双引号不同,Java 找到了由单引号包围的 ' '
-- 一个被单引号包围的空格,这告诉 Java 它正在处理原始数据类型 char
-- 这就是为什么 Java 将其视为加法操作的原因: 所有 Java 原始数据类型都是数字 -- 因此 Java 接受了这个提示,并将输出参数解释为一个 int
(2),加法运算符(+),一个 char
(一个空格字符) -- 它与无符号 short
相同,加法运算符(+),和另一个 int
(3)。空格字符的数值为32,所以在幕后转换中,您的语句被视为您编写了System.out.println(Integer.toString(2+32+3));
System.out.println("The answer is "+(3+" "+2));
System.out.println("The answer is "+(3+2));
System.out.println("The answer is "+(3+' '+2));
或者甚至更好
System.out.println('a' + 'b' + 'c');