Programming languages 为什么变量以数字开头是非法的?

Programming languages 为什么变量以数字开头是非法的?,programming-languages,Programming Languages,为什么变量以数字开头是非法的?我知道这是惯例,但原因是什么 编辑: 我的意思是像“1foo”或“23bar”这样的变量不仅仅是像“3”这样的数字,因为大多数语言中的lexer都会假设您试图指定一个数字文本。然后,您可以声明与数字文字无法区分的变量,从而造成巨大的歧义。数字被解释为“原样”,没有任何语法,而字符串/字符大多用引号表示 因此,程序可以理解包含字符的变量名和字符串之间的区别,但数字与之不同。突击测验:在允许变量以数字开头的假设语言中,这是什么 0xDEADBEEF 在C(和相关语言)

为什么变量以数字开头是非法的?我知道这是惯例,但原因是什么

编辑:
我的意思是像“1foo”或“23bar”这样的变量不仅仅是像“3”这样的数字,因为大多数语言中的lexer都会假设您试图指定一个数字文本。然后,您可以声明与数字文字无法区分的变量,从而造成巨大的歧义。

数字被解释为“原样”,没有任何语法,而字符串/字符大多用引号表示


因此,程序可以理解包含字符的变量名和字符串之间的区别,但数字与之不同。

突击测验:在允许变量以数字开头的假设语言中,这是什么

0xDEADBEEF

在C(和相关语言)中,这只能是十六进制数。如果语言允许变量名以数字开头,则可以是变量或十六进制数。这是一个可能有数百万人的简单例子。

一个原因,可能是最明显的一个原因,是它会让你的生活更加困难,而不会带来任何合理有用的东西。例如,在C语言中,您无法判断数字字符串是标识符还是数字文字

int 10 = 15;
int 15 = 10 + 5;
在第二行中,10是一个包含数字文字15的变量,还是数字文字10


另一个原因是,允许变量名以数字开头会使编译过程中的错误检查变得更加复杂,而且不会给表带来任何合理的有用信息。

在Prolog、Erlang和一些早期版本的Fortran语言中,您几乎可以做到这一点,因为完全不同的原因

Prolog/Erlang没有变量赋值,它们具有统一性。IIRC,如果X是一个变量,则处理
2=X
,或者
X=2
之后的代码(如果X可能具有值2)。所以如果X已经和一个值统一,那么这个值必须是2,如果不是,那么从那时起X变成2。因此编写
3=3
是可以的-它应该成为一个no-op,并且
2=3
总是失败-Prolog中的不匹配或者(我认为)Erlang中的运行时错误。数字的行为就像已经与数字所代表的值统一的变量

在早期的Fortran中(为二十年没有使用Fortran并忘记了它的语法而道歉),所有函数参数都是通过引用传递的,因此,如果您有一个函数,它相当于
void foo(int&x){x=3;}
,并用一个数字调用它,编译器会将该数字存储在一个静态变量中并传递它。因此,调用
foo(2)
将静态存储值设置为2到3。如果碰巧在其他地方对literal 2使用了相同的静态变量,例如使用literal
2
调用另一个函数,那么传递给第二个函数的值将改为3


因此,您可以拥有语法上与数字相同的变量,只要它们自动初始化为文本的值。但是如果你允许它们是可变的而不是纯粹的变量,那就有很多奇怪之处。

可能是因为这样就可以用许多语言编写例如2=3:)这不是一个选项(不应该)-以数字开头变量名是非法的。@Oded:请告诉我用“应该”替换的正确动词我的英语不太好:)单词
应该表明你可以。我会说“为什么在许多语言中变量以数字开头是非法的?”1e6,它是一个变量还是一百万它肯定会混淆大多数语言的lexer,很快就会混淆程序员!人人都赢!犯错误他很困惑。我是说,等等。你输入的关于东西的单词是什么?这将是一个只读变量,自动赋值为3735928559.G:+1。以下是你的前10点。欢迎来到Stackoverflow!