【问题标题】:character string literal and string literal in standard?标准中的字符串文字和字符串文字?
【发布时间】:2017-07-27 04:16:09
【问题描述】:

我被这四个术语弄糊涂了:

  • 字符串文字

  • 字符常量

  • 字符串字面量。

  • 多字节字符序列

C Standard 中阅读此引用:

字符串字面量不必是字符串(参见 7.1.1),因为 可以通过\0 转义序列将空字符嵌入其中。

第一部分是什么意思?

【问题讨论】:

  • 字符串文字 == 字符串文字
  • @DYZ 不完全是。该标准涉及字符、UTF-8 和宽字符串文字。不过,我认为这个问题是关于文字与字符串的。
  • 根据定义,字符串以空字符终止。字符串文字可能在其中包含空字符。因此,字符串文字可能不是字符串。
  • 请注意,文字的地址可能会被视为&"X"。对于像&'Y' 这样的常量,情况并非如此。

标签: c string constants string-literals


【解决方案1】:

字符串字面量

  • 字符串文字,例如"abc";
  • UTF-8 字符串文字,例如u8"abc";
  • 宽字符串字面量,例如L"abc"

来自标准(强调我的):

字符串文字是包含在 双引号,如"xyz"UTF-8 字符串字面量 是相同的,只是以 u8 为前缀。 宽字符串文字是相同的,除了前缀为LuU
....
在翻译阶段 7 中,将一个字节或值为零的代码附加到每个多字节 由一个或多个字符串文字产生的字符序列。 78)

78) 字符串字面量不必是字符串(见 7.1.1),因为空字符可以通过 \0 转义序列。


string 是一个连续的字符序列,以 第一个 null 结尾并包括在内 字符

因此,字符串文字可能在中间甚至开头也有\0,例如"a\0b""\0ab"。我想这就是脚注的意思。

字符常量是单引号中的c-char-sequence(通常是单个字符),可能带有前缀L/u/@ 987654333@.

整数字符常量是包含一个或多个多字节字符的序列 在单引号中,如'x'。宽字符常量是相同的,除了前缀 字母LuU

所以术语不是很对称,IMO。例如。宽字符常量是字符常量的特例。然而,字符串文字和宽字符串文字都属于字符串文字。

【讨论】:

  • 您好像漏掉了一个下划线。希望我把它修好了。
  • @MadPhysicist 谢谢!我想我们是在并行编辑)。
  • 所以里面包含空字符的字符串字面量也被空字符终止了吧?
  • @Sabrina 不,这是不对的。考虑char a[] = "x\0y";strlen(a) 将是1,但sizeof(a) 将是4a[2] 将是'y'
  • @zwol 你用“不,那不对”回答哪个问题?可能是已删除的评论还是我忽略了什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 2018-12-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多