为什么字符串文字可能不是字符串?

Why might a string literal not be a string?

我正在努力解决 C 标准中关于字符串文字的这一部分,尤其是它的第二部分:

"In translation phase 7, a byte or code of value zero is appended to each multibyte character sequence that results from a string literal or literals. 80)"


"80) A string literal might not be a string (see 7.1.1), because a null character can be embedded in it by a [=10=] escape sequence."

Source: ISO/IEC 9899:2018 (C18), §6.4.5/6, Page 51

我不明白解释 - “因为空字符可以通过 [=10=] 转义序列嵌入其中。”。


要查看参考部分 §7.1.1.,关于 "string" 的定义,说明:

"A string is a contiguous sequence of characters terminated by and including the first null character."

Source: ISO/IEC 9899:2018 (C18), §7.1.1/1, Page 132

我考虑过焦点可能放在“can”上,字符串文字不必 include/embed 空字符,而需要一个字符串。

但后来我又问自己:如果字符串文字中没有字符串终止空字符,如何将字符串文字用作字符串,以确定字符串的结尾(字符串需要操作函数)?

我现在完全是空白。


注意:我知道字符串文字存储在只读内存中,无法修改,字符串是一系列序列的通用术语以 NUL 结尾的字符,可以可变也可以不可变。

因此,我的问题不是:“字符串和字符串文字有什么区别?

我的问题是:

而且,据我所知,到目前为止:


我想自己问这个问题,但在发布之前不久,我得到了线索。我的困惑是因为引用中的措辞有点错位。

但我决定不删除问题的草稿,因为它可能对未来的读者有用,而是提供问答。

欢迎大家评论指教。


相关资料:

让我们看一下术语“字符串文字”在 C18 的同一部分的定义,§6.5.1/3:

"A character string literal is a sequence of zero or more multibyte characters enclosed in double-quotes, as in "xyz"."

据此,字符串文字仅由引号括起来的字符组成,即裸字符串内容。它没有附加 [=14=]。 NUL 字节稍后在翻译时附加,如 §6.5.1/6 所述:

"In translation phase 7, a byte or code of value zero is appended to each multibyte character sequence that results from a string literal or literals. 80)"


让我们举个例子:

"foo" 字符串文字 ,但不是 字符串 ,因为 "foo" 不包含 嵌入空字符。

"foo[=17=]" 是一个 string literal 和一个 string 因为 literal 本身在末尾包含一个空字符字符序列。


请注意,您无需在 字符串文字 的末尾显式插入空字符即可将其更改为 字符串.如前所述,它是在程序翻译过程中隐式附加的。

意味着,

const char *s = "foo";

等于

const char *s = "foo[=11=]";

我承认,那句话:

"A string literal might not be a string (see 7.1.1), because a null character can be embedded in it by a [=14=] escape sequence."

在上下文中有点混乱和不合逻辑。措辞会更好:

"A string literal might not be a string (see 7.1.1), because a null character might not (OR is not required to) be embedded in it by a [=14=] escape sequence."

或者:

"A string literal might not be a string (see 7.1.1), because a null character can be embedded in it by a [=14=] escape sequence."


@EricPostpischil pointed in his 一样,脚注的意思可能大不相同

这意味着如果 字符串文字 包含一个空字符,但不在末尾,因为 string, 字符串文字 不等同于 字符串.

F.e.: 字符串文字

"foo[=12=]bar"

不是 字符串 ,因为它包含 嵌入 的第一个空字符 字符串文字 ,但还没有结束。

你想多了。

"A string is a contiguous sequence of characters terminated by and including the first null character."

Source: ISO/IEC 9899:2018 (C18), §7.1.1/1, Page 132

表示“字符串”只延伸到第一个空字符。 null 之后可能存在的字符不是字符串的一部分。不过

"80) A string literal might not be a string (see 7.1.1), because a null character can be embedded in it by a [=11=] escape sequence."

明确表示字符串文字 可能 包含嵌入的空值。如果是,则字符串文字 AS A WHOLE 不是字符串——该字符串只是字符串文字的前缀,直到第一个 null