为什么字符串文字可能不是字符串?
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 结尾的字符,可以可变也可以不可变。
因此,我的问题不是:“字符串和字符串文字有什么区别?”
我的问题是:
- Why/How 字符串文字不能是字符串吗?
而且,据我所知,到目前为止:
- 字符串文字是否可以省略 NUL 字节?
我想自己问这个问题,但在发布之前不久,我得到了线索。我的困惑是因为引用中的措辞有点错位。
但我决定不删除问题的草稿,因为它可能对未来的读者有用,而是提供问答。
欢迎大家评论指教。
相关资料:
What is the difference between char s[] and char *s?
What is the type of string literals in C and C++?
Are string literals const?
"Life-time" of a string literal in C
让我们看一下术语“字符串文字”在 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
我正在努力解决 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 结尾的字符,可以可变也可以不可变。
因此,我的问题不是:“字符串和字符串文字有什么区别?”
我的问题是:
- Why/How 字符串文字不能是字符串吗?
而且,据我所知,到目前为止:
- 字符串文字是否可以省略 NUL 字节?
我想自己问这个问题,但在发布之前不久,我得到了线索。我的困惑是因为引用中的措辞有点错位。
但我决定不删除问题的草稿,因为它可能对未来的读者有用,而是提供问答。
欢迎大家评论指教。
相关资料:
What is the difference between char s[] and char *s?
What is the type of string literals in C and C++?
Are string literals const?
"Life-time" of a string literal in C
让我们看一下术语“字符串文字”在 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
notbe 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