2013-09-25 89 views
4
  1. 常量變量這樣可以工作:數組初始化使用C++

    const int size = 2; 
    int array[size] = {0}; 
    
  2. 這編譯錯誤:

    int a = 2; 
    const int size = a; 
    int array[size] = {0}; 
    

爲什麼呢?

+1

'const'並不意味着編譯時常量。 – chris

回答

6

因爲C++委員會中的人決定如此。

技術上的原因是用於初始化size的第一個表達式是一個常量表達式,可以在編譯期間計算出來。這意味着編譯器也可以知道數組的大小,並且可以在編譯時分配(在這種情況下「保留」可能是一個更合適的術語)。

在第二種情況下,表達式不是一個常量表達式(給定C++定義),並且這種混合是不可能的。

事實上,在第二種情況下,值確實是由size時間確定的初始化是完全不相關的。規則基於「表達式的種類」,第二個表達式使用可變變量,因此編譯器認爲它是非常量的。

允許編譯時初始化所述第二形式將需要一個流分析,因爲這將需要區分

之間

int a = 2; 
const int size = a; 

int a = foo(); 
const int size = a; 
其中涉及 size表達確實相同。

0

因爲在第一種情況下,size在編譯時由編譯器初始化。在第二種情況下,a可能被初始化爲運行時間,因此size也將在運行時被初始化並且不再是編譯時常量。

2

它正在進行內存管理。

當操作系統試圖運行你的程序因爲C++的本質,操作系統會想要知道堆棧區域的確切空間。在第一個例子中,OS會知道變量的值不會改變。但在圖OS的第一變量的是第二個例子「a」可以是變化

int a = 2; 

這個和這個

const int size = a; 

您的變量之間 一個可以是可變的。這就是爲什麼你的編譯器不讓你編譯你的代碼。

爲了瞭解更多關於內存管理的基礎知識。我建議你到 https://stackoverflow.com/a/24922/2326288這個評論。

3
const int size = 2; 
int array[size] = {0}; 

這裏,2是一個字面值,這意味着,你不能改變它,編譯器知道在編譯時的值。

int a = 2; 
const int size = a; 
int array[size] = {0}; 

然而,a是一個變量,這意味着價值a可以改變,所以編譯器禁止,你會在運行時是肯定的。 您可以使用

int a = 2; 
int size = a; 
int* array = new int[size]; 

這樣,你就可以申請用動態大小的數組。