2013-06-23 24 views
0

Q 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; 
} 

但我得到這個輸出。

1 

我在做什麼錯?

Q 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

如果它是一個長度爲10的數組,並且只存儲5個元素,那麼'odd [9]'將是一個對我們沒有意義的值。 – IcyFlame

回答

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-合格)聯合類型,對象的第一 非靜態命名的數據成員被zeroinitialized和填充是 初始化爲零比特;

- 如果T是一個數組類型,每個元素都是零初始化的;

- 如果T是引用類型,則不執行初始化。

§8.5.1.7

7要值初始化類型T的對象是指:

- 如果T是一個(可能是 CV修飾)類型(第9節)與用戶提供的構造函數 (12。1),那麼調用T的默認構造函數(如果T沒有可訪問的默認構造函數 ,則 初始化不合格);

- 如果T是一個(可能CV修飾)非工會類類型 無需用戶提供的構造函數,則該對象是 零初始化,並且如果T的隱式聲明的缺省構造 是非平凡,該構造函數被調用。

- 如果T是一個數組類型,那麼每個元素都進行了值初始化;

- 否則,該對象被零初始化。

0

odd[9]隨機抽取一塊內存,因爲你沒有初始化那麼遠的數組。

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都聲明爲int類型,所以在使用它們之前不需要轉換值。

當您在沒有索引的情況下打印even時,您正在打印數組的地址,而不是其中的任何內容。

+0

我想當你不把數組的索引打印數組直到空字符 –

+0

這恰好如果它是'char []'數組,因爲字符串處理不同於數值數組。 'char []'數組的名字是'char *',但是一個'int []'數組的名字是'int *'。而'cout'知道要適當地處理它們。 –

+2

這不是問題中的情況,因爲這裏的奇數不是未初始化的,而是用較少的元素初始化的,請參閱http://stackoverflow.com/questions/17257828/is-the-rest-element-of-array-在初始化時沒有更多的元素在初始化 –