为什么标识符不能以数字开头?

Bha*_*ani 13 java

为什么在java中(我不知道任何其他编程语言)标识符不能以数字开头,为什么以下声明也不允许?

int :b;
int -d;  
int e#;
int .f;
int 7g;
Run Code Online (Sandbox Code Playgroud)

jpr*_*ete 40

一般来说,你将这种限制放在一起有两个原因:

  1. 以电子方式解析是一件痛苦的事.
  2. 人类解析是一种痛苦.

请考虑以下代码段:

int d, -d;
d = 3;
-d = 2;
d = -d;
Run Code Online (Sandbox Code Playgroud)

如果-d是合法的标识符,那么最后的值是d多少?-3还是2?这是模棱两可的.

还要考虑:

int 2e10f, f;
2e10f = 20;
f = 2e10f;
Run Code Online (Sandbox Code Playgroud)

最后有什么价值f?这也是模棱两可的.

另外,无论哪种方式阅读都是一种痛苦.如果有人宣称2ex10,这是200万的错字还是变量名?

确保标识符以字母开头意味着它们可以与之冲突的唯一语言项是保留关键字.


Ste*_*202 7

那是因为Java语言规范的第3.8节说明了这一点.

标识符是无限长度的Java字母和Java数字序列,第一个必须是Java字母.标识符不能与关键字(第3.9节),布尔文字(第3.10.3节)或空文字(第3.10.7节)具有相同的拼写(Unicode字符序列).

至于为什么做出这样的决定:可能是因为这简化了解析,避免了模糊的语法,允许在语言的更高版本中引入特殊语法和/或出于历史原因(即因为大多数其他语言具有相同限制的类似限制).请注意,您的示例示例-d特别清楚:

int -d = 7;
System.out.println("Some number: " + (8 + -d));
Run Code Online (Sandbox Code Playgroud)

减号是标识符的第一部分,还是一元减号?

此外,如果你有两个-dd作为变量,这将是完全不明确的:

int -d = 7;
int d = 2;
System.out.println("Some number: " + (8 + -d));
Run Code Online (Sandbox Code Playgroud)

结果是15还是6?