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

时间:2013-06-23 04:13:31

标签: c++

问题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

3 个答案:

答案 0 :(得分:2)

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是a(可能是   cv-qualified)带有用户提供的构造函数的类类型(第9节)   (12.1),然后调用T的默认构造函数(和   如果T没有可访问的默认值,则初始化是错误的   构造函数);

     

- 如果T是(可能是cv限定的)非联合类类型   没有用户提供的构造函数,那么对象就是   零初始化,如果T是隐式声明的默认构造函数   是非平凡的,这个构造函数被调用。

     

- 如果T是数组类型,则每个元素都是值初始化的;

     

- 否则,该对象为零初始化。

答案 1 :(得分:0)

odd[9]正在拉随机数据块,因为你没有初始化那个数组。

答案 2 :(得分:0)

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时,您将打印数组的地址,而不是其任何内容。