[英]can't get right value with array
问1。
我想使用下面的代码将even [0]的值打印为10。
#include <iostream>
using namespace std;
int main()
{
int odd[10] = {1, 3, 5, 7, 9};
int even[1];
even[0]=(int)odd[0]+(int)odd[9];
cout<<even[0];
cin.get();
return 0;
}
但我得到了这个输出。
1
我究竟做错了什么?
问2。
但是当我将代码更改为
#include <iostream>
using namespace std;
int main()
{
int odd[10] = {1, 3, 5, 7, 9};
int even[1];
even[0]=(int)odd[0]+(int)odd[9];
cout<<even; // No index
cin.get();
return 0;
}
我得到了这个输出。
001EFD94
int odd[10] = {1, 3, 5, 7, 9};
初始化odd
为{1,3,5,7,9,0,0,0,0,0}
, (int)odd[0]+(int)odd[9]
将得到1
cout<<even;
将打印的地址even
,你想
std::cout<<even[0] << std::endl;
§8.5.1.5
零初始化T类型的对象或引用意味着:
- 如果T是标量类型(3.9),则将对象设置为值0(零),作为整数常量表达式,转换为T; 103
- 如果T是(可能是cv限定的)非联合类类型,则每个非静态数据成员和每个基类子对象都是零初始化的,并且填充初始化为零位;
- 如果T是(可能是cv限定的)联合类型,则对象的第一个非静态命名数据成员为零初始化,并且填充初始化为零位;
- 如果T是数组类型,则每个元素都是零初始化的;
- 如果T是引用类型,则不执行初始化。
§8.5.1.7
7要初始化T类型的对象,意味着:
- 如果T是具有用户提供的构造函数(12.1)的(可能是cv限定的)类类型(第9节),则调用T的默认构造函数(如果T没有可访问的默认构造函数,则初始化是错误的);
- 如果T是一个(可能是cv限定的)非联合类类型而没有用户提供的构造函数,那么该对象是零初始化的,如果T的隐式声明的默认构造函数是非平凡的,则调用该构造函数。
- 如果T是数组类型,则每个元素都是值初始化的;
- 否则,对象被零初始化。
odd[9]
正在拉一个随机的内存块,因为你没有初始化那个远的数组。
odd
阵列有足够的空间容纳10个值,但只有前5个明确初始化。 其他的被隐式初始化为0.所以
int odd[10] = {1, 3, 5, 7, 9};
具有相同的效果
// index: 0 1 2 3 4 5 6 7 8 9
int odd[10] = {1, 3, 5, 7, 9, 0, 0, 0, 0, 0};
所以行
even[0] = (int) odd[0] + (int) odd[9];
even[0]
为1 + 0.我想你想要
even[0] = odd[0] + odd[4];
请注意,由于odd
和even
都声明为int
类型,因此在使用它们之前不需要转换值。
even
没有索引也打印时,您打印的是数组的地址 ,而不是其中的任何内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.