繁体   English   中英

使用数组无法获得正确的值

[英]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];

请注意,由于oddeven都声明为int类型,因此在使用它们之前不需要转换值。

even没有索引也打印时,您打印的是数组的地址 ,而不是其中的任何内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM