考虑以下代码:
int x = 17;
int y = 013;
System.out.println("x+y = " + x + y);
当我运行此代码时,我得到输出1711.任何人都可以告诉我如何获得1711?
答案 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
使其成为十六进制