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

Why does C use two single quotes to delimit char literals instead of just one?

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

对于字符串文字,我们确实需要分隔开始和结束,因为字符串的长度不同,但在我看来,我们确实知道 char 文字的长度:单个字符(在源代码中) , 如果是常规字符转义则为两个字符(前缀[=10=]),如果是八进制文字则为五个字符(前缀[=11=][0-7])等

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

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

一些示例:

如果我们只在令牌的开头使用单引号,是否可行?

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

我们看到空字节文字和八进制文字具有相同的前缀,但可能没有任何歧义,因为 '[=16=] 后面紧跟着 723 可能没有任何歧义不是字符文字(至少在我看来)。如果存在歧义,则空字节文字可能会变成 \z

是否需要两个单引号才能正确解析字符文字?

一个答案(可能还有更多)可能是 C99 支持多字符文字。例如参见 [​​=12=].

因此,例如 'left' 是一个有效的(多)字符文字。

一旦您拥有多字符文字,您可能无法仅使用单引号来分隔字符文字。例如,如何仅用一个单引号分隔文字 'a c'

此类字面量的含义是实现定义的,所以我不知道此功能的支持程度如何。

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

除了这个和一般的美学之外,如果它只是 ' 而不是 [=,那么代表 space 字符的字符常量看起来会有些尴尬并且很可能会出错11=].

Why does C use two single quotes to delimit char literals instead of just one?

因为 C 的几个历史前辈(例如 PL/1, and B and some dialects of Fortran or ALGOL)都这样做了。

并且因为 C 标准(例如 n1570 或更新的标准)规定了这一点。

也许是因为在 1970 年代解析速度更快(对于 大多数 char 字面值,如 'z' ....)