为什么不能变量名以数字开头?为什么不能变量名以数字开头?(Why can't variabl

2019-06-17 10:07发布

我是用一个新的C ++开发人员的工作了一段时间后,当他问了一个问题:“为什么不能变量名称以数字”

我不能想出只是一些数字可以在他们(123456L,123456U)文本答案,如果编译器,用的字母字符一定量想着一切都被一个变量名,将是不可能的。

是正确的答案? 是否有其他原因?

string 2BeOrNot2Be = "that is the question"; // Why won't this compile?

Answer 1:

因为这时的数字串将是一个有效的标识符以及一个有效的数字。

int 17 = 497;
int 42 = 6 * 9;
String 1111 = "Totally text";


Answer 2:

那么想想这个:

int 2d = 42;
double a = 2d;

什么是? 2.0? 还是42?

提示,如果你不明白这一点,一个数后d意味着数字之前,它是一个双字面



Answer 3:

这是一个惯例了,但它开始作为一个技术要求。

在过去的语言如FORTRAN或BASIC解析器并不需要的空间的用途。 所以,基本上,以下是相同的:

10 V1=100
20 PRINT V1

10V1=100
20PRINTV1

现在假设数字前缀被允许。 你会如何解读?

101V=100

10 1V = 100

101 V = 100

1 01V = 100

所以,这是为非法。



Answer 4:

由于回溯避免在词法分析而编纂。 一个变量,如:

Apple;

编译器会知道这是一个标识符时,马上就遇到字母“A”。

然而就像一个变量:

123apple;

编译器将不能够决定它是否是一个数字或标识符,直到达到“A”,它需要回溯结果。



Answer 5:

编译器/解析器/词法分析器是很久很久以前的我,但我想我记得有在unambiguosly确定编译单元数字字符是否代表一个文字或标识为困难。

语言在空间是微不足道的(如ALGOL和FORTRAN原来如果我没记错的话)不能接受号码开头的标识符出于这个原因。

这又回来的路上 - 前特殊的符号来表示存储或数字基地。



Answer 6:

我同意这将是得心应手,让标识符开始以数字。 一个或两个人都提到,您可以通过预先下划线您标识绕开这个限制,但是这真难看。

我认为问题的一部分来自数的文字,如0xdeadbeef,这使得来很难了容易记住,可以以数字开头的标识符规则。 做到这一点的方法之一可能是允许任何匹配[A-ZA-Z _] +是不是关键字或数字面值。 问题是,这会导致像被允许0xdeadpork奇怪的事情,但不是0xdeadbeef。 最后,我想我们应该公平对待所有肉类:P。

当我第一次学习C,我记得感到变量名的规则是武断和限制。 最糟糕的是,他们是很难记住,所以我放弃了努力学习他们。 我只是做了觉得不对,和它的工作非常好。 现在,我已经很多更了解到,它似乎并没有那么糟糕,我终于可以学习它的权利。



Answer 7:

这可能是因为来的几个原因,当你解析你只需要看看第一个字符以确定它是否是一个标识或文本,然后将其发送到正确的函数进行处理令牌的决定。 所以这是一个性能优化。

另一种选择是检查,如果它不是一个文字,离开标识符的域是宇宙减去文字。 但要做到这一点,你就必须检查每个令牌的每个字符知道如何分类。

还有的文体意义标识符都应该是这样的助记符的话是多比数字更容易记住。 当正在写了很多原来的语言设置,因为还没有想取代未来几十年的样式“2”为“到”。



Answer 8:

使用一个数字,开始一个变量名,使编译过程中或interpertation很多更复杂的错误检查。

始于像一些允许使用的变量名称可能会导致对语言设计者巨大的问题。 在源代码解析,每当编译器/解释器遇到其中一个变量名,预计以数字开头的标记,它会通过一个巨大的,复杂的规则集搜索,以确定该令牌是否真的是一个变量,或错误。 增加的复杂性添加到语言解析器可能无法证明此功能。

早在我还记得(约40年),我不认为我曾经使用过,允许使用一个数字,开始变量名的语言。 我敢肯定,这样做至少一次。 也许,有人在这里实际上已经看到了这个地方。



Answer 9:

正如一些人已经注意到,有许多关于有效格式的变量名的历史包袱。 而语言的设计者总是被他们知道,当他们创造新的语言的影响。

尽管如此,几乎所有的时间,语言不允许变量名开始与数是因为那些语言设计的规则。 通常,这是因为这样一个简单的规则,使语言的解析和词法容易很多。 并非所有语言的设计者知道这是真正的原因,但。 现代词法工具帮助,因为如果你试图将其定义为允许,他们会给你解析冲突。

OTOH,如果你的语言有一个唯一识别符预示着变量名,就可以将其设置为他们以数字开头。 类似的规则变化,也可用于允许在变量名的空间。 但由此产生的语言可能不是像任何流行的传统语言非常多,如果在所有。

对于确实允许变量开始与数字和有嵌入的空格,看一个非常简单的HTML模板语言的一个例子Qompose 。



Answer 10:

因为如果你允许的关键字和标识符开始与数字小角色,词法分析器(编译器的部分)不能轻易数字文字的开始和没有得到一大堆更复杂(慢)关键字区分。



Answer 11:

该限制是任意的。 不同的Lisp允许符号名称开始与数字。



Answer 12:

变量名称不能以数字开头,因为它可能会导致像下面一些问题:

int a = 2;
int 2 = 5;
int c = 2 * a; 

什么是c的值? 4,或者是10!

另一个例子:

float 5 = 25;
float b = 5.5;

是第一5的数,或者是一个对象(操作者)有一个类似的问题与第二个5。

也许,还有一些其他的原因。 所以,我们不应该在变量名的beginnig使用任何数字。



Answer 13:

COBOL允许变量开始以数字。



Answer 14:

C ++不能拥有它,因为语言的设计者提出它的规则。 如果你要创建自己的语言,你当然可以允许它,但你可能会碰到他们也做了同样的问题,并决定不答应。 这将导致问题的变量名的例子:

0X,2D,5555



Answer 15:

其中一件关于放宽语法约定的关键问题是,它引入了认知失调进入编码过程。 你是如何看待你的代码可以通过不明确,这将引进的深深影响。

是不是谁的Dykstra说,“任何工具的最重要的方面是其对用户的影响”?



Answer 16:

大概是因为它可以更容易为人类弄清楚究竟是一个数字或一个标识,因为传统的。 有可能以数字开头不会词法扫描所有的东西复杂化标识符。

并非所有的语言都禁止以数字开头的标识符。 在Forth中,它们可以是数字,并且小整数被通常作为第四字(基本上标识符),因为它是快速地读取“2”作为一个例程,以一个2推到堆栈上,而不是承认“2”作为一个数定义其值是2(在从编程器或盘块处理输入,第四系统将根据空间分割的输入端。这将试图寻找令牌在字典中,以看看它是否是一个定义的字,并如果不将尝试把它翻译成一个数字,如果不将标记错误。)



Answer 17:

假设你是允许的符号名开始与数字。 现在假设你想命名变量12345foobar。 你将如何从12345区分呢? 这其实并不难用正则表达式做。 这个问题实际上是一个表现。 我真的不能解释为什么这是很详细,但它本质归结为从12345区分12345foobar需要回溯的事实。 这使得正则表达式不确定性。

有这样一个更好的解释这里 。



Answer 18:

很容易编译器来识别使用在存储器位置,而不是数ASCII的变量。



Answer 19:

我认为答案很简单,是可以的,限制是基于语言。 在C ++和其他许多人也不能因为语言不支持它。 它不是建立在规则允许的。

这个问题类似于问为什么不能国王在国际象棋一次移动四个空格? 这是因为在国际象棋是非法之举。 它可以在另一场比赛肯定。 它只是依赖于正在播放的规则。



Answer 20:

最初它只是因为它更容易记住(你可以给它更多的含义)的变量名字符串而不是数字,尽管数字可以包含在字符串中,以提高该字符串的意义或允许使用相同的变量名,但它已经被指定为具有单独的,但接近含义或上下文。 例如LOOP1,环2等会总是让你知道你是在一个循环和/或环2 LOOP1内的循环。 你喜欢哪种(更有意义)作为变量:地址或1121298? 这是更容易记住? 但是,如果语言使用的东西来表示,它不只是文本或数字(如$地址$),它真的不应该有所作为,因为这将告诉编译器,后面的内容被当作一个变量(在这种情况下)。 在任何情况下它归结为语言设计者希望为他们的语言规则使用什么。



Answer 21:

可变也可以在编译时由编译器视为一个值,因此该值可再次递归和再次调用该值



Answer 22:

回溯避免在词法分析阶段而编译的代码 。 像苹果的变量; ,编译器会知道它的一个标识符时,马上满足信词法分析阶段“A”字符。 然而,像123apple的变量; ,编译器将无法如果它决定一个数字或标识,直到达到“A”,它需要回溯在词法分析阶段去识别它是一个变量。 但它不是在编译器支持。

参考



Answer 23:

编译器有7相如下:

  1. 词法分析
  2. 语法分析
  3. 语义分析
  4. 中间代码生成
  5. 代码优化
  6. 代码生成
  7. 符号表

回溯避免在词法分析阶段而编译的代码。 像苹果的变量,编译器会知道它的标识符时,马上满足信词法分析阶段“A”字符。 然而,像123apple一个变量,编译器将无法如果它决定一个数字或标识,直到达到“A”,它需要回溯在词法分析阶段去识别它是一个变量。 但它不是在编译器支持。

当你解析令牌,你只需要看看第一个字符以确定它是否是一个标识或文本,然后将其发送到正确的函数进行处理。 所以这是一个性能优化。



Answer 24:

当进入声明variable.but存在时,它会尝试使用该变量其他地方像这样的一些不确定性可能有不妥的地方:

让1 =“世界,你好!” 打印(1)印刷(1)

打印是接受所有类型的变量的一般方法。 所以在这种情况下,编译器不知道哪一个(1)的编程是指:整数值的1或存储的字符串值的1。 编译器在这种情况下,也许更好的可以定义类似的东西,而是试图用这种暧昧的东西时,随身携带的纠错能力的错误,以准备怎么解决这个错误并清除这种不确定性。



文章来源: Why can't variable names start with numbers?