为什么标识符不能以java中的数字开头

时间:2014-11-01 12:24:43

标签: java

我想不出除了"数字串将是有效的标识符和有效的数字。"

除此之外还有其他解释吗?

4 个答案:

答案 0 :(得分:12)

因为这会使符号名称中的数字文字成为一个严肃的PITA。

例如,对于第一个字符有效的数字,名称0xdeadbeef0xc00lcafe的变量有效。但这也可以解释为十六进制数。通过将符号的第一个字符限制为非数字,可以避免这种歧义。

答案 1 :(得分:8)

如果可以,则可以进行此分配

int 33 = 44; // oh oh 

那么JVM如何区分数字文字和变量?

答案 2 :(得分:3)

保持编译器和程序员的规则简单。

标识符可以定义为任何不能被解释为数字的字母数字序列,但是您会遇到编译器以不同于您期望的方式解释代码的情况。

示例:

double 1e = 9;
double x = 1e-4;

x中的结果不是50.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"是单个标识符)。然而,这对可读性没有帮助,因此现代编译器放弃了这种趋势。