【问题标题】:Handling of Chracter in Java [duplicate]Java中的字符处理[重复]
【发布时间】:2015-07-27 09:23:20
【问题描述】:

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

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

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

【问题讨论】:

    标签: java


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

          • 它是字符串运算符重载方法 - 不。Java 没有运算符重载。编译器将使用StringBuilder 添加"a"+"b"
          【解决方案5】:

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

          你期待什么?

          【讨论】:

            【解决方案6】:

            在幕后,编译器表现得太聪明了并将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
            

            【讨论】:

            • gg 详细介绍,很高兴知道
            • 所以如果字符的总和大于 32,767,那么我假设总和将由 int 表示,对吧?
            • @Stephan - Ya.. 然后将使用ldc 代替sipush :)
            【解决方案7】:

            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);
            

            【讨论】:

              【解决方案8】:

              char+ 运算符定义为它们的整数值之和,得到一个整数。

              因为你问的是ASCII,所以我们必须这样解释总和……

              Java char 持有 UTF-16 代码单元值,UTF-16 是 Unicode 的编码,Unicode 是 ASCII 的超集,UTF-16 使用与 ASCII 相同的值对公共子集中的字符进行编码,并且在此代码中,UTF-16 代码单元(两个字节)的大小与 ASCII 代码单元(一个字节)的大小不同并不重要。

              因此,当您将两个包含 ASCII 子集中字符的 char 值相加时,总和与将它们的 ASCII 值相加相同。

              【讨论】:

                猜你喜欢
                • 2019-04-07
                • 1970-01-01
                • 2018-07-10
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2013-12-19
                • 2011-09-14
                • 2016-03-29
                相关资源
                最近更新 更多