标准中的字符串字面量和字符串字面量是什么?

7
我对这四个术语感到困惑:
  • 字符串字面值

  • 字符常量

  • 字符串字面值

  • 多字节字符序列

并阅读C标准中的这句话:

一个字符串字面值不需要是一个字符串(参见7.1.1),因为空字符可以通过\0转义序列嵌入其中。

第一部分是什么意思?

字符串字面值 == 字符串常量 - DYZ
@DYZ 不完全正确。标准是在谈论字符、UTF-8 和宽字符串字面值。不过,我认为这个问题更多的是关于字面值和字符串的区别。 - AlexD
1
一个字符串,根据定义,以空字符结尾。字符串字面值中可能包含空字符。因此,字符串字面值可能不是一个字符串。 - David Schwartz
1
请注意,文字常量的地址可以像&"X"一样获取。但对于类似&'Y'的常量则不行。 - chux - Reinstate Monica
1个回答

3
一个字符串字面量是:
- 要么是字符字符串字面量,例如“abc”; - 要么是UTF-8字符串字面量,例如u8“abc”; - 要么是宽字符串字面量,例如L“abc”。
从标准中可以看出:字符字符串字面量是由多个多字节字符组成的序列,用双引号括起来,例如“xyz”。UTF-8字符串字面量与此相同,但在前面加上u8。宽字符串字面量也是一样,只不过在前面加上字母L、u或U。在第7个翻译阶段,对于由一个或多个字符串字面量产生的多字节字符序列,会附加一个值为零的字节或代码。78) 字符串是以及包含第一个空字符的连续字符序列。因此,字符串字面量可能在中间甚至在开头有\0,例如“a\0b”或“\0ab”。字符常量是单引号中的c-char-sequence(通常是单个字符),可能带有前缀L/u/U。
整数字符常量是由一个或多个多字节字符组成的序列,用单引号括起来,例如'x'。宽字符常量也是一样,只不过在前面加上字母L、u或U。
因此,术语并不是非常对称,宽字符常量是字符常量的特殊情况。然而,字符字符串字面量和宽字符串字面量都属于字符串字面量。

看起来你少打了一个下划线。希望我已经正确修复了它。 - Mad Physicist
@MadPhysicist 谢谢!我觉得我们是同时在编辑。 - AlexD
那么包含空字符的字符字符串字面量也是以空字符结尾的,对吗? - Sabrina
@Sabrina 不对,考虑 char a[] = "x\0y"; strlen(a) 将是1,但 sizeof(a) 将是4,而 a[2] 将是 'y' - zwol
@zwol你用“不,那不对”的回答回答了哪个问题?可能是一个被删除的评论还是我漏看了什么? - AlexD
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接