java中单引号和双引号之间的区别?

时间:2015-09-05 07:32:34

标签: java

我有

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

  2. System.out.println(2+' '+3);

  3. 第一个打印2 3,而第二个打印37可以任何人解释为什么它打印37 ???

7 个答案:

答案 0 :(得分:3)

ascii中的

' '= 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节)到原始数字类型

For Numeric Types

  

对操作数(第5.6.2节)

执行二进制数字提升

Binary Numeric Promotion

  

[...]否则,两个操作数都将转换为int类型。

因此,2+" "+32 + " ",这是字符串连接,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');