我在回答问题时曾与一位新的C++开发人员合作:"为什么变量名称不能以数字开头?"
我无法想出答案,除了一些数字可以包含文本(123456L,123456U),如果编译器认为所有带有一些字母字符的数字都是变量名称,那就不可能.
这是正确的答案吗?还有其他原因吗?
string 2BeOrNot2Be = "that is the question"; // Why won't this compile?
Pyrolistical.. 111
好好想想这个:
int 2d = 42; double a = 2d;
什么是?2.0?还是42?
提示,如果你没有得到它,d之后的数字表示它是双字面之前的数字
好好想想这个:
int 2d = 42; double a = 2d;
什么是?2.0?还是42?
提示,如果你没有得到它,d之后的数字表示它是双字面之前的数字
因为那时一串数字将是有效的标识符以及有效的数字.
int 17 = 497; int 42 = 6 * 9; String 1111 = "Totally text";
这是一个惯例,但它始于技术要求.
在过去,FORTRAN或BASIC等语言的解析器不需要使用空格.所以,基本上,以下是相同的:
10 V1=100 20 PRINT V1
和
10V1=100 20PRINTV1
现在假设允许数字前缀.你怎么解释这个?
101V=100
如
10 1V = 100
或者作为
101 V = 100
或者作为
1 01V = 100
所以,这是非法的.
因为在编译时词法分析中避免了回溯.变量如:
Apple;
当符合字母'A'时,编译器会立即知道它是一个标识符.
但是变量如:
123apple;
编译器在命中'a'之前无法确定它是否是数字或标识符,因此需要回溯.
很长一段时间以前编译器/解析器/词法分析器对我来说,但我想我记得在确定编译单元中的数字字符是表示文字还是标识符方面存在困难.
空间无关紧要的语言(如果我没记错的话,就像ALGOL和原始的FORTRAN一样)因为这个原因而无法接受数字来开始标识符.
这可以追溯到 - 在特殊符号表示存储或数字基础之前.
我同意允许标识符以数字开头是很方便的.有一两个人提到你可以通过在你的标识符前加一个下划线来解决这个限制,但这真的很难看.
我认为问题的一部分来自数字文字,例如0xdeadbeef,这使得很难想出容易记住可以以数字开头的标识符的规则.一种方法可能是允许匹配[A-Za-z _] +的任何东西不是关键字或数字文字.问题是它会导致像0xdeadpork这样的奇怪事情,但不会导致0xdeadbeef.最终,我认为我们应该对所有肉类都公平:P.
当我第一次学习C时,我记得感觉变量名的规则是任意的和限制性的.最糟糕的是,他们很难记住,所以我放弃了尝试去学习它们.我只是做了感觉正确的事情,而且效果很好.现在我已经学到了更多,它似乎并不那么糟糕,我终于开始学习它了.
这可能是由于某些原因而出现的,当您解析令牌时,您只需要查看第一个字符以确定它是标识符还是文字,然后将其发送到正确的函数进行处理.这就是性能优化.
另一种选择是检查它是不是文字,并将标识符域保留为宇宙减去文字.但要做到这一点,你必须检查每个标记的每个字符,以了解如何对其进行分类.
还有风格含义标识符应该是助记符,所以单词比数字更容易记住.当写下很多原始语言时,为未来几十年设定风格,他们并没有考虑用"2"代替"to".