Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么可以';在java中,标识符以数字开头_Java - Fatal编程技术网

为什么可以';在java中,标识符以数字开头

为什么可以';在java中,标识符以数字开头,java,Java,我认为除了“数字串是一个有效的标识符,也是一个有效的数字”之外,其他任何东西都是无效的 除了这个,还有其他解释吗?如果可以,那么这个任务就可以了 int 33 = 44; // oh oh 那么JVM将如何区分数字文字和变量呢?因为这将使从符号名中辨别数字文字成为一个严重的PITA 例如,如果数字对第一个字符有效,则名称0xdeadbeef或0xc00lcafe的变量有效。但这也可以解释为十六进制数。通过将符号的第一个字符限制为非数字,可以避免此类歧义。这是在Java和许多其他语言中完成的,

我认为除了“数字串是一个有效的标识符,也是一个有效的数字”之外,其他任何东西都是无效的


除了这个,还有其他解释吗?

如果可以,那么这个任务就可以了

int 33 = 44; // oh oh 

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

因为这将使从符号名中辨别数字文字成为一个严重的PITA


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

这是在Java和许多其他语言中完成的,因此解析器可以对终端符号进行唯一分类,而不考虑其周围的上下文。从技术上讲,完全可以允许标识符看起来像数字,甚至像关键字:例如,可以编写一个解析器来解除对标识符的限制,允许您编写如下内容:

int 123 = 321; // 123 is an identifier in this imaginary compiler
编译器非常了解“理解”类型名后面的任何内容都必须是变量名,因此
123
是一个标识符,因此它可以将其视为有效的声明。然而,这将在将来产生更多的歧义,因为
123
在无效数字中被新的“标识符”所“遮蔽”

最后,这条规则是双向的:它帮助编译器设计者编写更简单的编译器,也帮助程序员编写可读的代码

请注意,要构建对标识符名称不太挑剔的编译器,例如

int a real int = 3

将用空格声明标识符(即,
“实整数”
是单个标识符)。不过,这对可读性没有帮助,因此现代编译器放弃了这一趋势。

这是为了使规则对编译器和程序员都保持简单

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

例如:

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

x
中的结果不是
5
,而是
0.0001
,因为
1e-4
是科学记数法中的一个数字,而不是解释为
1e
减去
4

为什么
for
用于指定循环是Java?这只是一个设计决策。“除了这个,还有其他解释吗”-如果你能想到一个原因,这是一个坏主意,为什么你需要另一个?主要是因为这样做会使语言非常容易出现错误。一个无害的文本可以通过在程序中的其他地方进行编辑而变成变量引用。另外:如果你事后返回33+1,它应该返回34还是45?我记得一个FORTRAN编译器(在一台旧的小型计算机上)允许语句
do 1=0到10
(相当于(1=0;1)的
,像“标识符名称必须至少有一个字母字符”这样的不太严格的规则可以避免这种情况。因此,您的示例没有说明标识符为什么不能以数字开头。为什么“标识符不能仅由数字组成”和“…以数字开头”之间有区别从标记器或解析器的角度来看,像
标识符这样的规则是不是保留字或数字文字[例如0x0]
的任何(字母|下划线|数字)序列都很简单。即使在有[非保留字]的语言中,这将是一个相对简单的练习。因此,不幸的是,你的答案充其量只是一个问题。