0

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

3 回答 3

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 是具有用户提供的构造函数(12.1)的(可能是 cv 限定的)类类型(第 9 条),则调用 T 的默认构造函数(如果 T 没有可访问的默认构造函数,则初始化是非良构的);

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

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

否则,对象被零初始化。

于 2013-06-23T04:17:19.543 回答
0

odd[9]正在拉取随机的内存块,因为您没有初始化数组那么远。

于 2013-06-23T04:16:27.637 回答
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都被声明为 type int,因此您无需在使用它们之前强制转换这些值。

当您在even没有索引的情况下打印时,您打印的是数组的地址,而不是它的任何内容。

于 2013-06-23T04:19:27.630 回答