C语言 为什么用“非数字”代替“字母或下划线”?

wfypjpf4  于 2023-04-29  发布在  其他
关注(0)|答案(2)|浏览(139)

这是一个关于术语的简单问题。
C11,6.4.2.1p1:

nondigit: one of
  _ a b c d e f g h i j k l m
    n o p q r s t u v w x y z
    A B C D E F G H I J K L M
    N O P Q R S T U V W X Y Z

“nondigit”这个名字很容易混淆,因为例如,$也是一个非数字。
有人知道为什么吗?(I)e的理由)它被命名为“nondigit”而不是“letter-or-underscore”?

t8e9dugd

t8e9dugd1#

对于命名标识符,需要实现支持数字09和非数字AZ(大写+小写)以及下划线_。因为_不是字母,所以这个组不能命名为 letters: 或类似的名称。在正式语法中需要两组符号的唯一原因是,由于历史原因,标识符不能以数字开头。
$不是有效的符号,不能用作C语言中标识符的一部分。你可能会被不符合规范的编译器弄糊涂,比如gcc允许$,即使在它假定的符合规范的模式-pedantic下。ISO C在附录J中将其列为“通用扩展”。5.

cwdobuhd

cwdobuhd2#

适当性说明:

1.####简洁明了
术语nondigit是一种简洁而精确的方式,用于指代一组非数字的特定字符,可用于命名标识符。* 它是清晰和明确的,并避免任何混淆 * 可能会出现使用更一般的术语,如字母或下划线。
1.####广泛使用 (可考虑)
术语nondigit在编程社区中广泛使用,不仅在C中,而且在其他编程语言(如Java和C++)中也使用。这使得它成为熟悉多种语言的程序员熟悉和可识别的术语。
1.####标识符专用
术语nondigit专门用于命名标识符的上下文中,这是C语言的一个重要方面。使用更通用的术语(如letter-or-underscore)可能会包含在标识符中使用无效的字符,例如特殊字符或带变音符号的外国字母。
1.####历史上下文
术语nondigit从最早的版本开始就在C语言中使用,并且可能是该语言的前身B的延续。这种历史背景增加了C语言中该术语的适当性。
在B编程语言中使用这个术语,影响了C的发展,这表明它是出于历史原因而选择的。
B语言的语法与C语言类似,使用nondigit来表示可以在标识符中使用的字符集,如下面的B代码片段所示:

main( ) {
  auto a, b, c, sum;

  a = 1; b = 2; c = 3;
  sum = a+b+c;
  putnumb(sum);
}
  • (对于其他信息,auto用于定义B中的36位变量)*

很可能术语nondigit是从B带入C的,因为C是作为B的扩展而开发的。nondigit的使用在C标准的后续版本中一直存在,包括当前的C18标准。
此外,使用简洁和明确的语言是编程语言规范中的常见做法。这可以在使用诸如空白换行符之类的术语来描述特定的字符集,而不是像空格换行符这样更具描述性的术语中看到。在C中使用nondigit遵循了这一惯例,为标识符中可以使用的字符集提供了一个清晰而具体的定义。
虽然使用像letter-or-underscore这样的术语来描述这组字符似乎更具描述性,但重要的是要注意,这可能会导致混淆或误解。例如,编程语言可以在其有效标识符字符集中包括其他特殊字符,例如重音字母或货币符号。使用更具体的术语,如nondigit,可以清楚地表明只有C规范中列出的字符才能在标识符中使用。
最终,在C中使用术语nondigit是一个惯例和历史先例的问题。* 虽然它可能不是最具描述性的术语,但它已经在语言中使用了很多年,并且在C规范中得到了很好的认可。

感谢@PeteKirkham指出错误并提供额外资源。

信息来源

  1. The Development of the C Language
  2. A Tutorial Introduction To The Language B

相关问题