我想不出除了"数字串将是有效的标识符和有效的数字。"
除此之外还有其他解释吗?
答案 0 :(得分:12)
因为这会使符号名称中的数字文字成为一个严肃的PITA。
例如,对于第一个字符有效的数字,名称0xdeadbeef
或0xc00lcafe
的变量有效。但这也可以解释为十六进制数。通过将符号的第一个字符限制为非数字,可以避免这种歧义。
答案 1 :(得分:8)
如果可以,则可以进行此分配
int 33 = 44; // oh oh
那么JVM如何区分数字文字和变量?
答案 2 :(得分:3)
保持编译器和程序员的规则简单。
标识符可以定义为任何不能被解释为数字的字母数字序列,但是您会遇到编译器以不同于您期望的方式解释代码的情况。
示例:
double 1e = 9;
double x = 1e-4;
x
中的结果不是5
,0.0001
,因为1e-4
是科学记数法中的数字,不会被解释为1e
减去{{1 }}
答案 3 :(得分:2)
这是在Java和许多其他语言中完成的,因此解析器可以唯一地对终端符号进行分类,而不管其周围的上下文。从技术上讲,完全可以允许标识符看起来像数字或甚至像关键字:例如,可以编写一个解析器来解除对标识符的限制,允许你写这样的东西:
int 123 = 321; // 123 is an identifier in this imaginary compiler
编译器知道足以“理解”类型名称后面的内容必须是变量名称,因此123
是标识符,因此可以将其视为有效宣言。但是,这会在未来产生更多歧义,因为123
会被无效的数字“遮盖”在您的新“标识符”中。
最后,规则可以双向运行:它可以帮助编译器设计人员编写更简单的编译器,还可以帮助程序员编写可读代码。
请注意there were attempts in the past构建对标识符名称不是特别挑剔的编译器 - 例如
int a real int = 3
将声明带空格的标识符(即"a real int"
是单个标识符)。然而,这对可读性没有帮助,因此现代编译器放弃了这种趋势。