C++ can';无法使用数组获取正确的值

C++ can';无法使用数组获取正确的值,c++,C++,问题1 我想用下面的代码将偶数[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; } 我做错了什么 问题2 但是当我把代码改成 #include <iostr

问题1

我想用下面的代码将偶数[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;
}
我做错了什么

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

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

int odd[10] = {1, 3, 5, 7, 9};
odd
初始化为
{1,3,5,7,9,0,0,0,0}
(int)odd[0]+(int)odd[9]
将获得
1

cout<<even;
§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(合格)类类型(第9条),具有用户提供的构造函数 (12.1),则调用T的默认构造函数(以及 如果T没有可访问的默认值,则初始化是格式错误的 建造商)

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

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

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


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];
偶数[0]
设置为1+0。我想你想要

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


当你打印
甚至不带索引的
时,你打印的是数组的地址,而不是它的任何内容。

我认为当你不放置数组的索引时,不能打印数组直到空图表,如果它是
字符[]
数组,这恰好是真的,因为字符串的处理方式与数字数组不同。
char[]
数组的名称是
char*
,而
int[]
数组的名称是
int*
。而
cout
知道如何恰当地处理它们。问题并非如此,因为这里的
odd
不是未初始化的,而是使用较少的元素初始化的,请参见链接上的同意@YuHao,数组的其余部分是
0
初始化的,而不是
未定义的
“其他的是未定义的,可能包含任何int值。”-其他的包含零,正如@YuHao所说。“编辑以反映这一点”-我不明白。如果它是一个长度为10的数组,而您只存储5个元素,那么
odd[9]
将是一个对我们来说毫无意义的值。
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] = odd[0] + odd[4];