处理Java中的字符

时间:2015-05-15 12:37:17

标签: java

我遇到了一个java打印字符是ASCII的情况。如果我们尝试打印两个字符,那么它会打印出ASCII值的总和。

System.out.println('c'); =>> c
System.out.println('a'+'b'); =>> 195 (97+98)

只想知道为什么在第二种情况下会打印出ASCII值的总和

8 个答案:

答案 0 :(得分:4)

因为char也可以被视为int。你实际上在做什么只是添加2个整数。

在您的第一个示例中,System.out.println('c');引用了System.out.println(char);,但在第二个示例中,'a'+'b'是一个整数,因此您正在调用System.out.println(int);

将其输出为字符串,将其转换为字符串

System.out.println(String.valueOf('c') + String.valueOf('b'));

答案 1 :(得分:3)

在幕后,编译器表现得过于聪明并将char + char替换为int 常量值

在第一种情况下调用println(char),在第二种情况下调用println(int)

示例代码:

public static void main(String[] args) {
    System.out.println('a');
    System.out.println('a' + 'b'); // the compiler first "resolves" the expression 'a'+'b' (since char cannot be added they are added as ints) and then tries to call the correct `println(int)` method.
}

字节代码:

public static void main(java.lang.String[]);
   descriptor: ([Ljava/lang/String;)V
   flags: ACC_PUBLIC, ACC_STATIC
   Code:
     stack=2, locals=1, args_size=1
        0: getstatic     #16                 // Field java/lang/System.out:Ljav
/io/PrintStream;
        3: bipush        97                 // for single char. (pushed a byte as an int)
        5: invokevirtual #22                 // Method java/io/PrintStream.prin
ln:(C)V
        8: getstatic     #16                 // Field java/lang/System.out:Ljav
/io/PrintStream;
       11: sipush        195                // push sum of 2 chars as a short
       14: invokevirtual #28                 // Method java/io/PrintStream.prin
ln:(I)V
       17: return

答案 2 :(得分:2)

使用char Ascii值,这是int val。正在计算增加的​​int val。但是对于下面的情况“a”+“b”,它是stringBuilder类,它将连接两个字符串。 的System.out.println( “A” + “B”); - > AB

答案 3 :(得分:2)

因为 char (非Character)是幕后的无符号整数类型。但是,当您添加两个 char 时,您会得到 int

你期待什么?

答案 4 :(得分:2)

Java使用双引号来定义字符串文字,使用单引号来定义字符文字 - 所以这个示例将连接两个字符串:

    String strA = "a";
    String strB = "b";
    System.out.println(strA + strB);

..而这个例子将打印将2个char整数值加在一起的结果:

    char charA = 'a';
    char charB = 'b';
    System.out.println(charA + charB);

答案 5 :(得分:1)

在幕后,charint表示,因此当您添加2个字符时,结果将是int,表示其ASCII值的总和。

答案 6 :(得分:1)

Java不像rupy / python那样完整的OO语言。基元是java最重要的部分。 因此,在第二个语句的情况下,它将仅使用ascii操作。 它不会连接字符,也不会传递“ab”。单引号中提到了字符。字符串在双引号内。 如果你传递“a”+“b”=“ab”,因为在这里你要添加两个字符串而不是字符。

答案 7 :(得分:0)

+的{​​{1}}运算符被定义为它们的整数值的总和,从而得到一个整数。

因为您询问ASCII,我们必须以这种方式解释总和......

Java char包含UTF-16代码单元值,UTF-16是Unicode的编码,Unicode是ASCII的超集,UTF-16编码公共子集中的字符,其值与ASCII确实如此,在这段代码中,UTF-16代码单元(两个字节)的大小与ASCII代码单元(一个字节)的大小不同并不重要。

因此,当您对ASCII子集中包含字符的两个char值求和时,总和与对其ASCII值求和相同。