C++ can';无法使用数组获取正确的值
问题1 我想用下面的代码将偶数[0]的值打印为10C++ 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
#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];