Java:两个整数的总和被打印为两者的串联

时间:2010-03-12 00:23:11

标签: java

考虑以下代码:

int x = 17;
int y = 013;
System.out.println("x+y = " + x + y);

当我运行此代码时,我得到输出1711.任何人都可以告诉我如何获得1711?

10 个答案:

答案 0 :(得分:11)

17直接存在。

013是十进制常量,等于十进制的11

013 = 1*8 + 3*1 = 8 + 3 = 11

在字符串后添加在一起时,它们被串联为字符串,而不是作为数字添加。

我认为你想要的是:

int x = 17;
int y = 013;
int z = x + y;

System.out.println("x+y = " + z);

System.out.println("x+y = " + (x + y));

这将是一个更好的结果。

答案 1 :(得分:8)

这里有两个问题:八进制文字和评估顺序。

int y = 013相当于int y = 11,因为基数8中的13在基数10中为11。

对于评估顺序,+运算符从左到右进行评估,因此"x+y = " + x+y相当于("x+y = " + x)+y,而不是"x+y = " + (x+y)。在Java中,空格是微不足道的。

请看下图(s.c.是字符串连接,a.a.是算术加法):

("x+y = " + x)+y
          |   |
     (1) s.c  |
              |
             s.c. (2)


"x+y = " + (x+y)
         |   |
         |  a.a. (1)
         |
        s.c. (2)

在这两个图中,(1)发生在(2)之前。

没有parantheses,编译器从左到右进行评估(根据优先级规则)。

 "x+y = " + x+y
          |  |
         (1) |
             |
            (2)

答案 2 :(得分:2)

你正在最后一次打印中进行字符串连接,因为你要添加一个字符串。由于"x+y = "是一个字符串,当您向其添加x时,它会向您"17"提供"x+y = 17"

如果013是八进制,所以被视为十进制,你得到11.当你连接这个时,你最终会得到"x+y = 17" + "11"1711

答案 3 :(得分:2)

"x+y = " + x+y

等于

("x+y = " + x) + y

等于

("x+y = " + String.valueOf(x)) + y

等于

"x+y = " + String.valueOf(x) + String.valueOf(y)

013是八进制= 11的十进制

答案 4 :(得分:0)

前缀为0的数字为octal。 13八进制是十进制小数。

x + y调用将两个参数都视为字符串,因此您将字符串“17”和“11”组合在一起。

答案 5 :(得分:0)

013是ocatal ...将其转换为十进制,你将得到11.查看here以获得八进制系统的解释。

答案 6 :(得分:0)

它是十进制17和八进制13的字符串连接(相当于十进制11)。

答案 7 :(得分:0)

似乎是将y解释为使用八进制表示法(计算结果为11)。此外,您在System.out.printLn中连接x和y的字符串表示。

答案 8 :(得分:0)

我只想补充Reed的解释,即013被解释为Octal 13,即十进制11。

答案 9 :(得分:0)

每个人都提到0使得数字为八进制 我只想补充一点, 0x 使其成为十六进制