9

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

变量名中不允许使用空格是否有技术原因,或者是否符合约定?

例如,是什么阻止我们做这样的事情?:

average score = sum of scores / number of scores

唯一想到的问题是关键字,但可以简单地限制在变量名中使用它们,词法分析器将能够区分变量的一部分和关键字。

4

3 回答 3

10

除了语言设计者的决定和单令牌标识符的历史之外,没有根本原因。事实上,有些语言确实允许使用多令牌标识符:MultiMedia Fusion 的表达语言、一些名字让我无法理解的 Mac 电子表格/笔记本软件,我相信还有其他的。不过,有几个考虑因素使这个问题变得不简单。

假设语言是自由形式的,您需要一个规范的表示,以便account name无论空格如何,都可以将标识符 like 视为相同。编译器可能需要使用一些修改约定来取悦链接器。然后你必须考虑它对外部导出的影响——为什么 C++ 有extern "C"链接说明符来禁用修饰。

正如您所见,关键字是一个问题。大多数 C 系列语言都有一个与标识符不同的词法类关键字,标识符不是上下文敏感的。您不能class在 C++ 中命名变量。这可以通过在多令牌标识符中禁止关键字来解决:

if account age < 13 then child account = true;

在这里,ifandthen不能是标识符的一部分,因此与account ageand没有歧义child account。或者,您可以在任何地方要求标点符号:

if (account age < 13) {
  child account = true;
}

最后一种选择是让关键字普遍地与上下文相关,这会导致以下问题:

IF IF = THEN THEN ELSE = THEN ELSE THEN = ELSE

最大的问题是并列是一个非常强大的句法结构,你不想轻易占据它。允许多令牌标识符可防止将并列用于其他目的,例如功能应用或组合。我认为,最好只允许大多数非空白字符,从而允许诸如canonical-venomous-frobnicator. 仍然有足够的可读性,但产生歧义的机会更少。

于 2013-12-25T06:12:04.950 回答
0

这是语言设计所强迫的。编译器需要找出单词的含义。编译器使用“状态机”方法,它需要区分关键字。也许将变量名放在“[”和“]”中会给我们一些解决方案(如 SQL)。但是在编码中使用它会更难......

于 2013-12-25T06:21:22.450 回答
-1

我认为这是因为语言的设计者遵循了这个约定。

我在 Google 上进行了搜索,发现在命名变量时,这是在命名变量时遵循的规则。

一些链接如下: -

以下规则适用于变量名:

  • 变量名不能包含空格。

变量名区分大小写。变量的名称可以是任何合法标识符——无限长度的 Unicode 字母和数字序列,以字母、美元符号“$”或下划线字符“ ”开头。然而,惯例是始终以字母开头变量名,而不是“$”或“ ”。此外,按照惯例,从不使用美元符号字符。您可能会发现在某些情况下自动生成的名称将包含美元符号,但您的变量名称应始终避免使用它。下划线字符也有类似的约定;虽然以“_”开头的变量名称在技术上是合法的,但不鼓励这种做法。不允许使用空格。

在上述所有链接中,您会发现设计者已遵循此命名约定来命名变量。

还要检查是否有任何语言允许其变量名中有空格

于 2013-12-25T06:03:50.487 回答