2015-08-16 55 views
0

請不要粗略地判斷我,我只是用C++編寫的新代碼 但是我的問題是下一個:爲什麼我們不能聲明一個具有參數大小的數組,其參數是我們進入自己嗎?例如:C++中數組的參數大小

int mas[i*]; 
cin>>i*; 

+0

您是否打算按該順序鍵入這些說明*? –

+0

不,我不打算按順序輸入這些說明! – Dmitrii

+0

但是我認爲擁有一個編譯器可以告訴計算機我將是一個非常棒的參數,它是我們自己進入的數組大小的實際含義的一個形式參數! – Dmitrii

回答

0

在C++中,數組是一個對象,其類型爲數組類型,所有變量和所有表達式的類型都是(靜態)程序的一部分,並且在編譯時必須知道。換句話說,編譯時必須知道mas的類型。

可以創建一個對象,其類型是在編譯時未知的是與陣列-new表達式,new T[n],但唯一的方式,即使在這種情況下,不存在該類型的值:你的唯一值可以從該表達式恢復的是類型爲T *的值,其中包含數組對象的第一個元素子對象的地址。

0

因爲當你創建一個數組時,程序需要爲它的元素分配足夠的內存。在你的例子中,數組元素的數量在聲明數組的時候仍然是未知的。

+0

是的,但爲什麼人們不能改進編譯器以便在輸入形式參數i *的實際含義後保留內存呢?在我們的例子中,它只需要將i *的實際含義乘以4即可,因爲數組的類型是int。 – Dmitrii

+0

@Dmitrii因爲C++不能這樣工作。做你想做的事情需要額外的基礎設施,語言從來沒有設計過。當然,人們可以嘗試添加這樣的事情。但是由此產生的語言在那時不再是標準的C++。 (當然,這個提議的特性的好處是否值得實現也是值得的。) – TheUndeadFish

+0

在這種情況下,編譯器必須爲從0到EOF-1的元素分配內存。 – Dmitrii

2

你可以這樣做:

int i; 
if (!(std::cin >> i)) 
    throw std::runtime_error("input failed"); 

std::vector<int> mas(i); 

請注意:vector是用C寫一個運行時大小的數組++的方式。 C風格的陣列大多存在歷史兼容性,應該避免。