首页 > 解决方案 > 在 C++ 中使用字符串文字初始化字符数组到底是什么?

问题描述

正如我所写char str[] = "1",是它char str[] = {'1', '\0'},还是char str[] = {"1"[0], "1"[1]}

但是,从编译器的角度来看,这两者是可以互换的,因为"1"is const char[2]. 它是如何定义的?或者更确切地说,“字符串文字值的字符”在 C++ 上下文中到底是什么意思?


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

或者也许:哪一个是标准的初衷?或者它只是明确地不关心它,因为实现的行为不受影响?

标签: c++

解决方案


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

诸如定义为表示以字节结尾的 -s 数组的文字字符串,因此完全一样,并且文字的行为与某些匿名数组完全一样,例如. 编译器被允许(但不是必需)以指针相等意义的方式编译。"1"charNULchar str[] = "1";char str[] = {'1', '\0'}"1"char anonymous_str[]={'1',0};"ab""b""ab"+1 == "b"

一个更微妙的问题是const字符串元素的 -ness 等......这在 C 和 C++ 中略有不同。在 C 中,由于历史原因,文字字符串具有不允许更改const的非类型元素。C 中的未定义行为char也是如此(其中的类型是或更准确的),但 IIRC 在 C++ 中是被禁止的(错误类型的)(其中的类型是或更准确的)。"abc"[1] = '.';"abc"(char*)char[4]"abc"(const char*)const char[4]

并且任何优秀的优化C++ 编译器都可以char str[] = {"1"[0], "1"[1]} 完全char str[] = {'1', '\0'}or一样处理char str[] = "1"(根据as-if 规则)。

对于C11,请阅读其n1570标准及其§6.4.5 字符串文字

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

PS。正式地,n1570 & n3337 是草稿。在实践中,它们是标准(但必须购买官方文档)。


推荐阅读