c++ - 在 C++ 中使用字符串文字初始化字符数组到底是什么?
问题描述
正如我所写char str[] = "1"
,是它char str[] = {'1', '\0'}
,还是char str[] = {"1"[0], "1"[1]}
?
但是,从编译器的角度来看,这两者是可以互换的,因为"1"
is const char[2]
. 它是如何定义的?或者更确切地说,“字符串文字值的字符”在 C++ 上下文中到底是什么意思?
我的想法是,如果它是“字符串文字的元素”,它应该是第二个。但标准中的措辞似乎使其模棱两可。
或者也许:哪一个是标准的初衷?或者它只是明确地不关心它,因为实现的行为不受影响?
解决方案
(您最初的标题提到了 C 和 C++;它们是不同的语言)
诸如定义为表示以字节结尾的 -s 数组的文字字符串,因此完全一样,并且文字的行为与某些匿名数组完全一样,例如. 编译器被允许(但不是必需)以指针相等意义的方式编译。"1"
char
NULchar 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 是草稿。在实践中,它们是标准(但必须购买官方文档)。
推荐阅读
- python - 根据首字母缩写词前面的大写字符数获取缩写词
- machine-learning - Caffe MLP 示例
- r - 堆积条形图上的错位误差条
- android - 为什么splashactivity在mainactivity启动时闪烁
- postgresql - 读取由 debezium postgres connect 填充的 Docker Kafka 消息
- vue.js - VUEX 没有找到突变,但它被定义了
- c# - 无法在 C# 程序中下载 JDK
- javascript - 在 React 组件中,从 api 返回的不变数据存储在哪里,以便组件方法可以访问它?
- reactjs - 为什么有两个
滚动应用栏需要在 Material-UI 示例文档中正确呈现的组件? - c - 为什么 gcc 会为返回非 int 的函数的隐式声明产生错误?