我有
System.out.println(2+" "+3);
System.out.println(2+' '+3);
第一个打印2 3,而第二个打印37可以任何人解释为什么它打印37 ???
答案 0 :(得分:3)
' '= 32
。
a:) System.out.println(2+" "+3); // string concatenation
b:) System.out.println(2+' '+3); // 2+ 32(32 ascii valur for space)+3 so 37
答案 1 :(得分:3)
引用Additive Operators的Java语言规范:
如果
+
运算符的任一操作数的类型为String
,则该操作为字符串连接。否则,
+
运算符的每个操作数的类型必须是可转换的类型(第5.1.8节)到原始数字类型
对操作数(第5.6.2节)
执行二进制数字提升
[...]否则,两个操作数都将转换为
int
类型。
因此,2+" "+3
是2 + " "
,这是字符串连接,String + 3
也是字符串连接,因此2 + " " + 3
是"2" + " " + "3"
,这意味着{ {1}}。
"2 3"
为2+' '+3
,空格字面为2 + ' '
,因此转换为char
(32),int
为{{ 1}}。
如果文字是变量,它实际上就是这样,其中对变量的赋值仅用于说明中间结果的类型:
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);
都被重载,因此它们的方法并不完全相同。
因为它们是文字,而不是变量,编译器会在编译时完成它,你真的得到它(尝试反汇编.class文件以便自己查看):
append()
答案 2 :(得分:1)
第一个是将所有内容转换为字符串。第二个是转换为整数。空格的十进制代码是32.如果你想要2和3是字符串,那么使用引号。
答案 3 :(得分:0)
这是因为您要打印2+ ' ' +3
的整数值,它会将' '
翻译为char
而不是string
,它只会将b)部分转换为它的ASCII值导致2 + ASCII value of Space + 3
,最终结果为37,因为space
的ASCII值为32。
答案 4 :(得分:0)
第一个例子是执行字符串连接,所以答案非常直观。第二个例子是不同的,因为''不是一个字符串,它是一个字符。 char被转换为整数代码,这就是你得到这个数字的原因。
答案 5 :(得分:0)
这里的连接几乎就是Java容忍的一种情况。在其他情况下,char' '和字符串" "显示为真:有很多不同的类型。
答案 6 :(得分:0)
除非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将其视为一个加法运算的原因:all java primitive data types are numbers - 所以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');