为什么C使用两个单引号来分隔字符字面量而不是一个?



C真的需要两个单引号(撇号)来分隔字符字面量而不是一个吗?

对于字符串字面量,我们确实需要分隔开始和结束,因为字符串的长度各不相同,但在我看来,我们确实知道字符字面量的长度:单个字符(在源中),两个字符(前缀),如果是八进制字符(前缀[0-7]),五个字符,等等。

请记住,我在寻找一个技术上的答案,而不是历史上的答案。它是否使解析更简单?它在70年代的硬件上是否简化了解析?它是否允许更好地解析错误消息?诸如此类。

(同样的问题也适用于大多数受C语法启发的语言,因为它们似乎都使用相同的语法来分隔字符字面值。我认为Jai编程语言可能是个例外,因为我似乎记得它只使用一个问号(在开头),但我不确定。

一些例子:

  • 'G'
  • ''
  • '723'

如果我们在令牌的开头使用一个单引号,它会工作吗?

  • 'G
  • '
  • '723

原则上,我们是否可以在不使语法复杂化的情况下以相同的方式解析这些标记?

我们看到空字节字面值和八进制字面值有相同的前缀,但可能没有任何歧义,因为'紧跟着723可能不是char字面值(至少在我看来)。如果存在歧义,则空字节字面值可以改为z

是否需要两个单引号来正确解析字符字面量?

cppreference.com说多字符常量已经从B编程语言继承到C语言,所以可能从一开始就存在。因为它们可以有不同的宽度,所以结尾引号几乎是必需的。

除了这个和一般的美学之外,一个代表空格字符的字符常量看起来有些尴尬,如果它只是'而不是' ',那么它很可能会引起错误。

一个答案(可能还有更多)可能是C99支持多字符文字。请看下面这个SO问题。

例如,'left'是一个有效的(多)字符字面值。

一旦有了多字符字面值,您可能就不能仅仅使用单引号来分隔字符字面值了。例如,如何只用一个单引号分隔文字'a c'?

这样的字面量的含义是实现定义的,所以我不知道这个特性得到了多大的支持。

为什么C使用两个单引号来分隔字符而不是一个?

因为C的几个历史前身(例如PL/1, B和Fortran或ALGOL的一些方言)都是这样做的。

并且因为C标准(例如n1570或更新的东西)指定了

也许是因为在20世纪70年代,解析(对于大多数char字面值,如'z'....)

更快。