问题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
答案 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];
请注意,由于odd
和even
都声明为int
类型,因此您无需在使用之前强制转换值。
当您在没有索引的情况下打印even
时,您将打印数组的地址,而不是其任何内容。