以下代码:
int i = 0_10;
System.out.println(i);
产生输出:
8
在javadocs中,写着我们不能加下划线
在数字的开头,如示例int x5 = 0x_52;
中所示,产生错误illegal underscore
。
但是,在此代码中,0
是八进制数的前缀,因为我们可以看到输出为8
。但是没有产生错误。
i
的值 8 ,这意味着0_10
是八进制数字,0
是前缀。0_10
不会产生非法下划线错误,这意味着0
不是前缀,而是数字的一部分。为什么不产生错误? java将部分视为八进制,部分不是吗?
答案 0 :(得分:2)
因为JLS says:
允许下划线作为数字之间的分隔符,表示整数。
(我的重点) 0x_52
中的下划线不是数字之间的 。
是的,有一个奇怪的是,一个数字在八进制中的指标只是以0
开头(后面没有x
)。并且它导致没有混乱,但它(0
)是一个数字,因此0_10
符合JLS规则。
它确实是明确的:
在十六进制或二进制文字中,整数仅由0x或0b字符后面的数字表示,并且在任何类型后缀之前。因此,下划线可能不会在0x或0b之后立即出现,或者在数字的最后一位之后出现。
在十进制或八进制文字中,整数由任何类型后缀之前的文字中的所有数字表示。
注意区别。 (为清楚起见:通过“类型后缀”,他们谈论的是“{”的l
/ L
,“浮动”的f
/ F
,等)
java是否将其部分视为八进制,部分不是?
没有。 0
是数字的一部分,也是数字以八进制表示的指标。 20世纪70年代,当Gosling将其设计为在20世纪90年代使用类似于C语言的语法时,这是一个奇怪的符号,来自C语言的继承。
值得注意的是,这个奇怪的符号已经造成了足够的麻烦,当他们最终正式将八进制添加到JavaScript(另一种语言也使用相似的语法)时,他们使用0o
作为前缀代替。 (在2015规范之前,JavaScript中没有正式的八进制形式,尽管在2009规范中已经注意到某些实现已经完成了C的事情。截至2009年的规范,它们不允许以严格的模式,并且2015规范引入了0o
。[在2015规范中,出于兼容性原因,他们还在浏览器[仅]中以松散模式制作了旧的“遗留”形式 。)