在C ++中用字符串文字初始化字符数组的确切含义是什么?

时间:2019-01-30 05:31:40

标签: c++

在我写char str[] = "1"时是char str[] = {'1', '\0'}还是char str[] = {"1"[0], "1"[1]}

但是,从编译器的角度来看,由于"1"const char[2],所以这两个是可以互换的。如何定义?或者说,在C ++上下文中“字符串文字值的字符”到底是什么意思?


我在想的是,如果它是“字符串文字的元素”,它应该是第二个。但是该标准中的措辞似乎使其模棱两可。

或者也许:该标准的初衷是哪一个?还是只是因为它不影响实现的行为而明确地不在乎它?

1 个答案:

答案 0 :(得分:3)

(您的初始标题同时提到了C和C ++;它们是不同的语言)

"1"之类的literal string进行了定义,表示char-s的数组,以 NUL 字节结尾,因此char str[] = "1";就像char str[] = {'1', '\0'}一样,而文字"1"表现得像一个char anonymous_str[]={'1',0};这样的匿名数组。允许(但不是必需)编译器以"ab"指针相等的方式编译"b""ab"+1 == "b"

一个更微妙的问题是字符串元素的const性质,等等。这在C和C ++中略有不同。在C语言中,由于历史原因,文字字符串具有类型为const的非char元素,不允许更改。因此,"abc"[1] = '.';在C语言中是undefined behavior(其中"abc"的类型是(char*)或更确切地说是char[4]),但是IIRC被禁止(输入错误) C ++(其中"abc"的类型为(const char*)或更准确地为const char[4])。

任何优秀的optimizing C ++编译器都可以像char str[] = {"1"[0], "1"[1]}char str[] = {'1', '\0'}(按as-if rule)一样精确地处理char str[] = "1"

对于C11,请阅读其n1570标准和其§6.4.5 string literals

对于C++11,请阅读其n3337标准和§2.14.5字符串文字。对于更高版本的C ++,请查找并参考其标准文档。

PS。正式地,n1570和n3337是草稿。实际上,它们是标准(但是必须购买官方文档)。