在Java中,为什么int a=('a'+'b'+'c');的输出是不同的形式 System.out.println('a'+'b'+'c'+"")

In Java, why the output of int a=('a'+'b'+'c'); are different form System.out.println('a'+'b'+'c'+"")

原题是这样的

public class test {
    public static void main(String[] args){
        int i = '1' + '2' + '3' + "";
        System.out.println(i);
    }
}

这给了我一个错误:

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
    Type mismatch: cannot convert from String to int

然后我把代码改成这样:

public class test {
    public static void main(String[] args){
        int i = '1' + '2' + '3';
        System.out.println(i);
    }
}

输出是 150。

但是当我这样写代码时:

public class test {
    public static void main(String[] args){
        System.out.println('a'+'b'+'c'+"");
    }
}

输出变成294。

不知道为什么。

  • 第一个不编译,因为你在末尾连接了一个字符串,这导致值是一个不能直接转换为 int 的字符串。
  • 第二个的输出是150,因为字符1、2、3的ASCII值是49、50、51,return加法时是150。
  • 最后一个的输出是 294,因为你在 ASCII 中做 char 值的加法 table (97+98+99)

您可以验证 a、b 和 c(或任何其他字符)的值 here

编辑: 为了解释为什么最后一个输出正确的值而不是抛出错误,您首先将所有值相加,如前所述,然后将其转换为字符串添加"" 到字符的 ASCII 值的总和。但是,println 方法需要一个字符串,这就是它不会抛出任何错误的原因。

如果你愿意,第一个就可以了Integer.parseInt('1' + '2' + '3' + "");

第一个是不可能的,因为你无法通过这种方式将 String 转换为 int

第二个有效,因为 chars 是一种数字,所以添加 chars 就是添加它们真正的数字。 Char '1' 是数字 49(见 ASCII table),所以总和是 49+50+51 即 150.

第三个以这种方式工作,因为 + 是左括号运算符,这意味着 'a'+'b'+'c'+"" 应读作 (('a'+'b')+'c')+""'a' 有 ASCII 码 97,所以你有 294+""。然后 Java 知道应该将值转换为 String 才能连接两个字符串。最后你有字符串 294。将您最后的代码修改为以下 System.out.println('a'+'b'+('c'+""));,您将看到结果将是 195c.

您必须注意 System.out.println 是一种用于将值(不同类型)转换为它们的 String 表示的方法。这总是可能的,因为每个 int 都可以转换为它的 String 表示,但反之则不行;不是每个 String 都是 int 的代表(所以 Java 不会让你这么简单地做)。

当你这样做时

int i = '1' + '2' + '3';

JVM 对给定数字的 ASCII 码求和。结果是 150.

当您添加空 String 时,您试图将 int/charString 相加。这不可能。您可以将 char 隐式转换为 int ,反之亦然,因为它们是基本类型。您不能对 String 对象执行此操作,因为它们不是基元而是引用。这就是您收到错误的原因。

当您执行 println 时,原始值首先被求和并自动 装箱 为引用类型,因此总和被装箱到 Character 对象中.空 String 转换为 Character,然后添加到第一个。所以结果是一个具有 ASCII 代码 294 的 Character 对象。然后调用 CharactertoString 方法,因为这就是 println(Object) 方法的作用。结果是 294

我希望这能帮助您了解正在发生的事情:)

首先:[int i = '1' + '2' + '3' + "";] 如果你concat一个空字符串值,你把它转换成一个String对象,然后String对象不能转换成int。

第二个:[int i = '1' + '2' + '3';] char 上的二进制算术运算提升为 int。它等于: [int i = 49 + 50 + 51] - 总计:150.

第三个:[System.out.println('a'+'b'+'c'+"");] 在这种情况下,您将 'a' + 'b' + 'c'(即 294)转换为 String (+""),然后像 String 值一样打印结果,这样就可以了。