繁体   English   中英

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

[英]Difference between single quotes and double quotes in java?

我有

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

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

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

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

引用附加运算符的 Java语言规范:

如果+运算符的任一操作数的类型是String ,则操作是字符串连接。

否则, +运算符的每个操作数的类型必须是可转换(第5.1.8节)到原始数字类型的类型

对于数字类型

对操作数执行二进制数字提升(第5.6.2节)

二进制数字促销

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

所以, 2 + " " 2+" "+32 + " " ,这是一个字符串连接,而String + 3也是字符串连接,因此2 + " " + 3"2" + " " + "3"这意味着"2 3"

2 + ' ' 2+' '+32 + ' ' ,空格文字是char ,因此它被转换为int (32),而2 + 32 + 337


如果文字是变量,它实际上就是这样,其中对变量的赋值仅用于说明中间结果的类型:

// 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.如果你想要2和3是字符串,那么使用引号。

那是因为你正在打印2 2+ ' ' +3的整数值,它会将' '作为char而不是string转换为简单地将b)部分转换为它的ASCII值,这将导致2 + ASCII value of Space + 3 ,最终结果为37,因为space的ASCII值为32。

第一个例子是执行字符串连接,所以答案非常直观。 第二个例子是不同的,因为''不是一个字符串,它是一个字符。 char被转换为整数代码,这就是你得到这个数字的原因。

像这里的连接几乎是Java容忍的一种情况。 在其他上下文中,char''和String“”显示为true:有很多不同的类型。

除非System.out.println的输出参数显式为java.lang.String否则java会自动将它作为输出参数给出的任何数据类型和对象转换为java.lang.String

在你的第一个例子中, System.out.println(2+" "+3); java所做的是扫描输出参数并找到一个int (2),双引号" "表示双引号内的字符数组将被解释为String ,另一个int (3)。 Java将String " "视为提示,参数中的其他所有内容也应被视为字符串。 那么有效的是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 (空格字符) - 与unsigned 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');

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM