[英]can't get right value with array
問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
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是數組類型,則每個元素都是值初始化的;
- 否則,對象被零初始化。
odd[9]
正在拉一個隨機的內存塊,因為你沒有初始化那個遠的數組。
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
沒有索引也打印時,您打印的是數組的地址 ,而不是其中的任何內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.