【问题标题】:why does a char + another char = a weird number为什么一个 char + 另一个 char = 一个奇怪的数字
【发布时间】:2023-03-16 10:42:01
【问题描述】:

这里是sn-p的代码:

public static void main (String[]arg) 
{
    char ca = 'a' ; 
    char cb = 'b' ; 
    System.out.println (ca + cb) ; 
}

输出是:

195

为什么会这样?我认为'a' + 'b' 可以是"ab""12"3

这是怎么回事?

【问题讨论】:

  • 从昨天开始你已经问了 6 个问题,而且都是关于 java 中一些最简单的问题。难道你不认为值得读一些关于 Java 基础的书吗?
  • 我在看书。问问题不好吗?如果提问不好,那么这个网站就不好。如果这个网站不好,那么你就没有动力关心我问了多少问题或首先来到这里。因此,无论天气如何或不问问题都是不好的,没有动力去关心。
  • OP在他的问题上付出了努力,给出了示例代码和他自己的思想分析等。这是一个新手问题,但它显示了一个需要鼓励的学习过程。
  • 抛开问题的有效性(我认为这很好) - 这是我见过的最愚蠢的逻辑证明,大卫。谢谢你的笑声。

标签: java char string-concatenation implicit-conversion


【解决方案1】:

两个char 中的+ 是算术加法,而不是字符串连接。您必须执行"" + ca + cb 之类的操作,或者使用String.valueOfCharacter.toString 方法来确保+ 的至少一个操作数是String,以便运算符成为字符串连接。

JLS 15.18 Additive Operators

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

否则,+ 运算符的每个操作数的类型必须是可转换为原始数值类型的类型,否则会发生编译时错误。

至于为什么你得到 195,这是因为在 ASCII 中,'a' = 97'b' = 9897 + 98 = 195


这执行基本的intchar 转换。

 char ch = 'a';
 int i = (int) ch;   
 System.out.println(i);   // prints "97"
 ch = (char) 99;
 System.out.println(ch);  // prints "c"

这忽略了字符编码方案的问题(初学者不应该担心......但是!)。


作为注释,Josh Bloch 指出,很遗憾+ 对字符串连接和整数加法都进行了重载(“对于字符串连接重载 + 运算符可能是一个错误。” -- Java Puzzlers,谜题 11:最后的笑声)。通过使用不同的字符串连接标记可以轻松避免很多此类混淆。


另见

【讨论】:

  • @abelenky,使用小写字母 'a,'b'` 以确保准确性。
  • David:如果您在 Windows 中打开“charmap”或“Character Map”,您会看到字符“a”和“b”分别具有 ASCII 值 97 和 98。您可能想在 Wikipedia 中查找“ASCII”。
  • 有没有办法将 ASCII 数字转换回字符。有没有一种方法需要 99 并返回 'c'?
  • @David:我举了基本铸造的例子。
【解决方案2】:

如果你想要一个字符串作为 + 运算符的结果,你必须使用字符串类型作为操作数。

你应该写:

public static void main (String[]arg) 
{
    String ca = "a" ; 
    String cb = "b" ; 
    System.out.println (ca + cb) ; 
}

应用于 char 操作数的 + 运算符表现为算术和。

【讨论】:

    【解决方案3】:

    + 运算符不像对字符串那样对字符进行操作。这里发生的情况是 ab 被转换为它们的整数 ASCII 代码点 - 97 和 98 - 然后加在一起。

    【讨论】:

      【解决方案4】:

      我不会说 Java,但 195 是 97 + 98 = ab 的 ASCII 码。很明显,cacb 被解释为它们的整数值,可能是因为 + 的添加似乎不会自动导致字符串连接。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-02-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-23
        • 1970-01-01
        相关资源
        最近更新 更多