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

Java 在前缀和数字之间使用下划线时没有错误,java,octal,Java,Octal,以下代码: int i = 0_10; System.out.println(i); 生成输出: 八, 在这本书中,我们写着不能加下划线 在一个数字的开头,如示例int x5=0x\u 52,它产生错误非法下划线 然而,在这段代码中,0是八进制数的前缀,因为我们可以看到输出是8。但并没有产生错误 i的值为8,这意味着0_10是一个八进制数,0是前缀 但是0\u 10不会产生非法下划线错误,这意味着0不是前缀,而是数字的一部分 为什么它不产生错误?java是否部分地将其视为八进制,部分地不视

以下代码:

int i = 0_10;
System.out.println(i);
生成输出:

八,

在这本书中,我们写着不能加下划线 在一个数字的开头,如示例
int x5=0x\u 52
,它产生错误
非法下划线

然而,在这段代码中,
0
是八进制数的前缀,因为我们可以看到输出是
8
。但并没有产生错误

  • i
    的值为8,这意味着
    0_10
    是一个八进制数,
    0
    是前缀
  • 但是
    0\u 10
    不会产生非法下划线错误,这意味着
    0
    不是前缀,而是数字的一部分
为什么它不产生错误?java是否部分地将其视为八进制,部分地不视为八进制

因为:

允许下划线作为表示整数的数字之间的分隔符

(我强调)0x\u 52中的下划线不在数字之间

是的,有点奇怪,一个数字是八进制的指示器只是以
0
开头(后面不是
x
)。它引起了无尽的混乱,但它(代码0)是一个数字,因此符合JLS规则

它确实继续明确地说明了这一点:

在十六进制或二进制文字中,整数仅由0x或0b字符之后和任何类型后缀之前的数字表示。因此,下划线可能不会立即出现在0x或0b之后,也不会出现在数字的最后一位之后

在十进制或八进制文字中,整数由文字中任何类型后缀之前的所有数字表示

注意区别。(为了清楚起见:通过“type suffix”,他们指的是
l
/
l
代表“long”,而
f
/
f
代表“float”,等等。)

java是否部分地将其视为八进制,部分地不视为八进制

没有。
0
是数字的一部分,也是数字八进制的指示器。这是20世纪70年代C语言中的一个奇怪的符号概念,当Gosling设计它时,Java继承了这个概念,使用了与90年代C语言相似的语法


值得注意的是,这种奇怪的符号已经造成了足够多的麻烦,当他们最终正式向JavaScript添加八进制时(另一种语言也使用类似的语法),他们使用
0o
作为前缀。(在2015年规范之前,JavaScript中没有正式的八进制格式,尽管2009年规范中指出一些实现已经完成了C的工作。截至2009年规范,它们不允许在严格模式下使用,2015年规范引入了
0o
。[在2015年规范中,它们还制作了浏览器中需要的旧“遗留”格式[仅限于]在松散模式下,出于兼容性原因。]

根据:“您只能在数字之间放置下划线”;因此
0_10
是合法的,甚至可以将其作为一个明确的示例:
int x9=0_52;//OK(八进制文字)
来自Hulk的链接:“在Java SE 7和更高版本中,任何数量的下划线字符(389;)都可以出现在数字文字中的任何数字之间……”哇,我认为这是从更早的时候开始的。应该有一个编译器标志来禁止所有八进制文字。(默认情况下IntelliJ会发出警告)嗯。。。你用过八进制格式吗?你见过使用它的代码吗?我从来没有。