为什么变量名不能以数字开头?

Jer*_*iah 126 c++ variables programming-languages language-design variable-names

我在回答问题时曾与一位新的C++开发人员合作:"为什么变量名称不能以数字开头?"

我无法想出答案,除了一些数字可以包含文本(123456L,123456U),如果编译器认为所有带有一些字母字符的数字都是变量名称,那就不可能.

这是正确的答案吗?还有其他原因吗?

string 2BeOrNot2Be = "that is the question"; // Why won't this compile?
Run Code Online (Sandbox Code Playgroud)

Pyr*_*cal 111

好好想想这个:

int 2d = 42;
double a = 2d;
Run Code Online (Sandbox Code Playgroud)

什么是?2.0?还是42?

提示,如果你没有得到它,d之后的数字表示它是双字面之前的数字

  • 这实际上是[相对]迟到的符号("d"代表"双"),C89标准IIRC.如果此构造使用该语言,则无法使用标识符中的主要数字,但这并不是数字不能启动标识符的原因. (11认同)
  • 它是针对 Java 的,虽然最初的问题是针对 C++ 的,但它也适用于许多其他语言,例如 Java。但我同意。这不是标识符不能以数字开头的最初原因。 (2认同)

ski*_*ppy 103

因为那时一串数字将是有效的标识符以及有效的数字.

int 17 = 497;
int 42 = 6 * 9;
String 1111 = "Totally text";
Run Code Online (Sandbox Code Playgroud)

  • 如果它必须是数字+ alpha,那么你仍然可以做字符串0x123 ="Hello World".除非你声明变量名称是"数字+ alpha不能解析为有效的数字名称",否则这只是愚蠢的. (38认同)
  • 那么,如果他们说变量不能只是数字呢?那又怎样? (35认同)
  • @eaolson:我使用过一个汇编程序,它将该规则应用于以"A`-`F`开头并以`h`结尾的十六进制数字.第一次尝试定义标签指向Bach的Two Part Invention#13(逻辑名称?'Bach`)的音乐数据时,我绊倒了. (9认同)
  • 我需要更长时间才能找到一个正则表达式,让词法分析器使用该规则获取标识符,如果它甚至可能,那么我可以看到为什么没有语言实现过这种方式,除了给出的原因其他答案. (6认同)
  • 不要介意编译器:使用语言*的人*需要能够(一目了然)区分变量名和数字.如果第一个字符没有告诉你 - 相反,如果你需要搜索单词的其余部分来判断那里的某个地方是否存在非数字alpha,则代码将难以阅读. (4认同)
  • 这是公认的答案,这是错误的.我编写编译器,并且很容易让标识符成为包含至少一个字母的字符串,而不管它的开头是什么. (3认同)
  • 有些语言*支持*在数字之上进行分配.这些语言将允许分配3的代码为4. (2认同)
  • "除非你声明变量名称是'数字+ alpha不能解析为有效的数字名称',否则这只是愚蠢的." 但语言与关键字完全相同:变量名称是一系列不解析为有效保留字的字母. (2认同)

Roy*_*tus 43

这是一个惯例,但它始于技术要求.

在过去,FORTRAN或BASIC等语言的解析器不需要使用空格.所以,基本上,以下是相同的:

10 V1=100
20 PRINT V1
Run Code Online (Sandbox Code Playgroud)

10V1=100
20PRINTV1
Run Code Online (Sandbox Code Playgroud)

现在假设允许数字前缀.你怎么解释这个?

101V=100
Run Code Online (Sandbox Code Playgroud)

10 1V = 100
Run Code Online (Sandbox Code Playgroud)

或者作为

101 V = 100
Run Code Online (Sandbox Code Playgroud)

或者作为

1 01V = 100
Run Code Online (Sandbox Code Playgroud)

所以,这是非法的.

  • 小问题:行号必须位于第 1-6 列中,可执行代码必须位于第 8 列之后。另一方面,“DO 10 I=1,50”可能会被含糊地解析为“DO1 0I=1,50”[顺便说一句,如果使用句点而不是逗号,则该语句将成为对名为“DO10I”的浮点变量的赋值。 (2认同)

Jia*_*ang 36

因为在编译时词法分析中避免了回溯.变量如:

Apple;
Run Code Online (Sandbox Code Playgroud)

当符合字母'A'时,编译器会立即知道它是一个标识符.

但是变量如:

123apple;
Run Code Online (Sandbox Code Playgroud)

编译器在命中'a'之前无法确定它是否是数字或标识符,因此需要回溯.

  • 通过记住我的编译器设计类来进行回答,这个答案很正确!荣誉 (2认同)

Ken*_*tle 13

很长一段时间以前编译器/解析器/词法分析器对我来说,但我想我记得在确定编译单元中的数字字符是表示文字还是标识符方面存在困难.

空间无关紧要的语言(如果我没记错的话,就像ALGOL和原始的FORTRAN一样)因为这个原因而无法接受数字来开始标识符.

这可以追溯到 - 在特殊符号表示存储或数字基础之前.


all*_*ode 7

我同意允许标识符以数字开头是很方便的.有一两个人提到你可以通过在你的标识符前加一个下划线来解决这个限制,但这真的很难看.

我认为问题的一部分来自数字文字,例如0xdeadbeef,这使得很难想出容易记住可以以数字开头的标识符的规则.一种方法可能是允许匹配[A-Za-z _] +的任何东西不是关键字或数字文字.问题是它会导致像0xdeadpork这样的奇怪事情,但不会导致0xdeadbeef.最终,我认为我们应该对所有肉类都公平:P.

当我第一次学习C时,我记得感觉变量名的规则是任意的和限制性的.最糟糕的是,他们很难记住,所以我放弃了尝试去学习它们.我只是做了感觉正确的事情,而且效果很好.现在我已经学到了更多,它似乎并不那么糟糕,我终于开始学习它了.

  • 大声笑 - "问题在于它会导致像0xdeadpork这样的奇怪事情,但不会导致0xdeadbeef.最终,我认为我们应该对所有肉类都公平:P." (6认同)

sba*_*dat 7

变量名不能以数字开头,因为它会导致一些问题,如下所示:

int a = 2;
int 2 = 5;
int c = 2 * a; 
Run Code Online (Sandbox Code Playgroud)

c的值是多少?是 4,还是 10!

另一个例子:

float 5 = 25;
float b = 5.5;
Run Code Online (Sandbox Code Playgroud)

is first 5 a number, or is an object (. operator) 第二个5也有类似的问题。

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


Wil*_*iam 6

这可能是由于某些原因而出现的,当您解析令牌时,您只需要查看第一个字符以确定它是标识符还是文字,然后将其发送到正确的函数进行处理.这就是性能优化.

另一种选择是检查它是不是文字,并将标识符域保留为宇宙减去文字.但要做到这一点,你必须检查每个标记的每个字符,以了解如何对其进行分类.

还有风格含义标识符应该是助记符,所以单词比数字更容易记住.当写下很多原始语言时,为未来几十年设定风格,他们并没有考虑用"2"代替"to".


Kyl*_*nes 5

限制是任意的。各种 Lisps 允许符号名称以数字开头。


小智 5

COBOL 允许变量以数字开头。