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