【发布时间】:2020-09-25 16:53:30
【问题描述】:
我在 C 标准中关于字符串文字的这一部分苦苦挣扎,尤其是它的第二部分:
"在翻译阶段 7 中,一个字节或值为零的代码被附加到每个由一个或多个字符串文字产生的多字节字符序列。80)"
"80) 字符串文字可能不是字符串(参见 7.1.1),因为空字符可以通过
\0转义序列嵌入其中。"来源:ISO/IEC 9899:2018 (C18),§6.4.5/6,第 51 页
我不明白解释 - “因为空字符可以通过 \0 转义序列嵌入其中。”。
查看引用的第 7.1.1 节,关于“字符串”的定义,声明如下:
"字符串是一个连续的字符序列,以第一个空字符结尾并包括第一个空字符。"
来源:ISO/IEC 9899:2018 (C18),§7.1.1/1,第 132 页
我想过重点可能放在“can”上,字符串文字不必包含/嵌入空字符,而字符串需要.
但是我又一次问自己:如果字符串中没有以字符串结尾的空字符,如何将字符串文字用作字符串来确定字符串的结尾(字符串操作函数所必需的) )?
我现在完全是在画空白。
注意:我知道字符串文字存储在只读内存中并且不能修改,字符串是由 NUL 终止的字符序列的通用术语,可以或不能是可变的。
因此,我的问题不是:“字符串和字符串文字有什么区别?”
我的问题是:
- 为什么/如何字符串文字不是字符串?
根据我的担忧,到目前为止:
- 字符串文字可以省略 NUL 字节是真的吗?
我想自己问这个问题,但在发布之前不久,我得到了线索。我的困惑是因为引文中的一些错位的措辞。
但我决定不删除问题的草稿,因为它可能对未来的读者有用,而是提供问答。
请随意评论和提示。
相关内容:
【问题讨论】:
-
我会说这是文档中的一个错误——
char *p = "foo\0bar";我们可以说p指向一个长度为 3 的字符串;p+4指向另一个字符串 :) -
@pmg 确实如此。
"foo\0bar"是包含 两个 字符串的字符串文字,因此它不是 a 字符串。是的,就是这么简单。
标签: c string null language-lawyer string-literals