char + int 给出意想不到的结果

char + int gives unexpected result

我需要打印'H3110 w0r1d 2.0 true'作为输出。 下面是编写的代码,输出为“3182 w0r1d 2.0 true”。

public class HelloWorld {
    public static void main (String[] args){

        char c1= 'H';
        int num1 = 3110;
        char c2='w';
        byte b=0;
        char c3='r';
        int y=1;
        char c4='d';

        float f = 2.0f;
        boolean bool= true;
        String s = c1+num1 + " " + c2+b+c3+y+c4 + " " + f + " " + bool;
        System.out.println(s);
    }
}

查询:如果我连接 H3110,它将打印为 3182。为什么会这样?

除非至少一个操作数是 String 类型,否则 + 运算符不使用字符串连接。忽略 + 运算符的其余部分,您基本上是在寻找“如果我将 charint 加在一起会发生什么” - 答案是“char 被提升int,并执行正常的整数加法”。 'H' 的提升值为 72(因为这是 'H' 的 UTF-16 数值),因此结果为 3182.

针对您的情况,最简单的解决方法是将 c1 的类型更改为 String 而不是 char:

String c1 = "H";

然后将使用字符串连接而不是整数加法。

您应该使用 Java 5 中介绍的 StringBuilder,它具有方法 .append() 和 char/int/long 等... class 是 Java 中正确的字符串连接器,允许您通过其字符串表示连接任何基元 (char/int/long ...)。

System.out.println(4+3+"s"); // will print "7s"
System.out.println(StringBuilder.append(4).append(3).append("s").toString()); // will print "43s"

如@Zabuzard 所述 Java 编译器将用 StringBuilder 替换字符串总和 (+) 但 char+int 会 return 和 int(并且 int 不是 String)。 获取有关 char + int returning int 的详细说明。 我建议你@JonSkeet 回答:)

public class Main {
    public static void main(String[] args) {
        char c1= 'H';
        int num1 = 3110;
        char c2='w';
        byte b=0;
        char c3='r';
        int y=1;
        char c4='d';

        float f = 2.0f;
        boolean bool= true;
        String s = new StringBuilder()
                .append(c1)
                .append(num1)
                .append(c2)
                .append(b)
                .append(c3)
                .append(y)
                .append(c4)
                .append(f)
                .append(bool)
                .toString();
        System.out.println(s);
    }
}

此问题的另一种解决方案可能是使用静态方法

String.valueOf(c1)

更好的方法是使用前面提到的 StringBuilder,但使用 String.valueOf 是另一种解决方案,对代码的影响比使用 StringBuilder 的效果更小。