这是一个关于术语的简单问题。
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”?
2条答案
按热度按时间t8e9dugd1#
对于命名标识符,需要实现支持数字
0
到9
和非数字A
到Z
(大写+小写)以及下划线_
。因为_
不是字母,所以这个组不能命名为 letters: 或类似的名称。在正式语法中需要两组符号的唯一原因是,由于历史原因,标识符不能以数字开头。$
不是有效的符号,不能用作C语言中标识符的一部分。你可能会被不符合规范的编译器弄糊涂,比如gcc允许$
,即使在它假定的符合规范的模式-pedantic
下。ISO C在附录J中将其列为“通用扩展”。5.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代码片段所示:
很可能术语nondigit是从B带入C的,因为C是作为B的扩展而开发的。nondigit的使用在C标准的后续版本中一直存在,包括当前的C18标准。
此外,使用简洁和明确的语言是编程语言规范中的常见做法。这可以在使用诸如空白和换行符之类的术语来描述特定的字符集,而不是像空格或换行符这样更具描述性的术语中看到。在C中使用nondigit遵循了这一惯例,为标识符中可以使用的字符集提供了一个清晰而具体的定义。
虽然使用像letter-or-underscore这样的术语来描述这组字符似乎更具描述性,但重要的是要注意,这可能会导致混淆或误解。例如,编程语言可以在其有效标识符字符集中包括其他特殊字符,例如重音字母或货币符号。使用更具体的术语,如nondigit,可以清楚地表明只有C规范中列出的字符才能在标识符中使用。
最终,在C中使用术语nondigit是一个惯例和历史先例的问题。* 虽然它可能不是最具描述性的术语,但它已经在语言中使用了很多年,并且在C规范中得到了很好的认可。
感谢@PeteKirkham指出错误并提供额外资源。
信息来源