为什么变量以数字开头是非法的?我知道这是一个约定,但原因是什么?
编辑: 我的意思是像“1foo”或“23bar”这样的变量不仅仅是像“3”这样的数字
答案 0 :(得分:6)
因为大多数语言中的词法分析器都会假设您正在尝试指定数字文字。然后你可以从数字文字中声明难以区分的变量,从而产生一个模糊的巨大重磅炸弹。
答案 1 :(得分:3)
流行测验:用一种允许变量以数字开头的假设语言,这是什么?
0xDEADBEEF
在C(及相关语言)中,这只能是十六进制数。如果语言允许变量名以数字开头,则可以是变量或十六进制数。这是可能数百万的一个简单例子。
答案 2 :(得分:1)
数字被解释为'原样'而没有任何语法,而字符串/字符大多用引号表示。
因此,程序可以理解包含字符的变量名和字符串之间的区别,但它与数字不一样。
答案 3 :(得分:1)
一个原因,可能是最明显的一个原因,就是它会让你的生活变得更加困难,而不会给桌子带来任何合理的用处。例如,在C中,您将无法判断数字字符串是标识符还是数字文字。
int 10 = 15;
int 15 = 10 + 5;
在第二行中,10是一个保存数字文字15的变量,还是数字文字10?
另一个原因是,允许变量名以数字开头会使编译期间的错误检查变得更加复杂,同样不会给表带来任何合理的用处。
答案 4 :(得分:0)
在Prolog,Erlang和Fortran的早期版本等语言中,由于完全不同的原因,你几乎要做到这一点。
Prolog / Erlang没有变量赋值,它们具有统一性。 IIRC,如果X是变量,则如果X可能具有值2,则处理2 = X
或X = 2
之后的代码。因此,如果X已经与值统一,则该值必须为2,如果没有,从那时起X变为2。所以写3 = 3
很好 - 它应该变成无操作,2 = 3
总是失败 - 在Prolog中不匹配或者(我认为)在Erlang中运行时错误。数字的行为类似于已经与数字代表的值统一的变量。
在早期的Fortran中(对于二十年来没有使用fortran而忘记其语法的道歉),所有函数参数都是通过引用传递的,所以如果你有一个等同于void foo ( int &x ) { x = 3; }
的函数并且用一个函数调用它number,编译器会将数字存储在静态变量中并传递给它。因此,调用foo (2)
会将静态存储值设置为2到3.如果它恰好在其他地方使用相同的静态变量2,例如使用文字2
调用另一个函数,那么传递给第二个函数的值将是3。
因此,只要它们被自动初始化为文字的值,您就可以拥有在语法上与数字相同的变量。但如果你允许它们变成相当纯粹的变量,那就很奇怪了。