C++中结构的奇怪行为[第2部分]
strange behaviour of structures in C++[part 2]
这是C++第1部分中结构的奇怪行为的延续
如果我做这个
#include<iostream>
using namespace std;
struct box
{
//int simple_int;
int arr[3];
};
int main()
{
box a={10,20,30};
//box b={100};
//cout<<b.simple_int<<"n";
cout<<a.arr[0];
}
输出:10,这是正确的。
但如果我删除这些评论。
#include<iostream>
using namespace std;
struct box
{
int simple_int;
int arr[3];
};
int main()
{
box a={10,20,30};
box b={100};
cout<<b.simple_int<<"n";
cout<<a.arr[0];
}
输出:100 20 //instead of 100 10
为什么?
box a = {10, 20, 30};
将初始化为:
a.simple_int = 10;
a.arr = {20, 30, 0};
当您输出a.arr[0]
时,它将输出20,正如预期的那样。
您的代码给出了正确的输出。
您的结构将在以下位置初始化:
a.simple_int = 10;
a.arr = {20, 30, 0};
所以a.arr[0]
将是20。
您的程序输出:100 20
如预期。
如果你想避免这种误解,初始化你的结构更像:
box a = { 100, { 10, 20, 30 } };
这样一来,结果就是:
a.simple_int == 100;
a.arr[0] == 10;
不能像那样初始化数组。在第二个例子中,结构有一个int和一个int数组。a
的初始化与任何内容都不对应,因此编译器会为您部分填充它。
您可以编写a = {5, {10, 20, 30}}
,使a.simple_int
成为5
,并使a.arr
成为这3个值的数组。
相关文章:
- 如何循环打印顶点结构
- 通过方法访问结构
- 使用不带参数的函数访问结构元素
- 预处理器:插入结构名称中的前一个行号
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 孤立代码块在结构中引发异常
- 有什么方法可以遍历结构吗
- 如何在 C# 中映射双 C 结构指针?
- 如何在C++中使用结构生成映射
- C++结构成员函数定义如果在结构体外部定义,则它们会有所不同
- 不是在结构体内部工作,而是在结构体外部工作的自定义类实例
- 如何在结构体内部实现指针
- 模板函数转换为结构体内部的函数指针
- 可以引用定义在结构体内部的友元操作符吗?
- 容器在结构体内部崩溃
- 从结构体内部调用成员函数指针所指向的函数
- 不能使用SFML在结构体内部构造vector对象
- 将枚举(在结构体内部声明的)值赋给结构体内部相同枚举类型的变量
- 比较if语句中结构体内部的值
- 在结构体内部定义operator()函数