簡體   English   中英

使用數組無法獲得正確的值

[英]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];

請注意,由於oddeven都聲明為int類型,因此在使用它們之前不需要轉換值。

even沒有索引也打印時,您打印的是數組的地址 ,而不是其中的任何內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM