在前缀和数字之间使用下划线时没有错误

时间:2016-01-30 12:47:53

标签: java octal

以下代码:

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将部分视为八进制,部分不是吗?

1 个答案:

答案 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规范中,出于兼容性原因,他们还在浏览器[仅]中以松散模式制作了旧的“遗留”形式 。)