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

class giri{ public static void main(String args[]) { int x = 17; int y = 013; System.out.println("x+y = " + x+y); } } 

当我运行程序时,我得到输出1711.任何人都可以告诉我如何获得1711

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

这将是一个更好的结果。

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

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

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

请看下面的图表( sc是字符串连接, aa是算术加法):

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

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

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

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

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

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

 "x+y = " + x+y 

等于

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

等于

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

等于

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

013是八进制=十进制的11

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

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

013是ocatal …将其转换为十进制,你将得到11.看看这里的八进制系统的解释。

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

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

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

每个人都提到0使数字八进制。
我只想添加0x使其成为hex