常量變量這樣可以工作:數組初始化使用C++
const int size = 2; int array[size] = {0};
這編譯錯誤:
int a = 2; const int size = a; int array[size] = {0};
爲什麼呢?
常量變量這樣可以工作:數組初始化使用C++
const int size = 2;
int array[size] = {0};
這編譯錯誤:
int a = 2;
const int size = a;
int array[size] = {0};
爲什麼呢?
因爲C++委員會中的人決定如此。
技術上的原因是用於初始化size
的第一個表達式是一個常量表達式,可以在編譯期間計算出來。這意味着編譯器也可以知道數組的大小,並且可以在編譯時分配(在這種情況下「保留」可能是一個更合適的術語)。
在第二種情況下,表達式不是一個常量表達式(給定C++定義),並且這種混合是不可能的。
事實上,在第二種情況下,值確實是由size
時間確定的初始化是完全不相關的。規則基於「表達式的種類」,第二個表達式使用可變變量,因此編譯器認爲它是非常量的。
允許編譯時初始化所述第二形式將需要一個流分析,因爲這將需要區分
和之間
int a = 2;
const int size = a;
int a = foo();
const int size = a;
其中涉及
size
表達確實相同。
因爲在第一種情況下,size
在編譯時由編譯器初始化。在第二種情況下,a
可能被初始化爲運行時間,因此size
也將在運行時被初始化並且不再是編譯時常量。
它正在進行內存管理。
當操作系統試圖運行你的程序因爲C++的本質,操作系統會想要知道堆棧區域的確切空間。在第一個例子中,OS會知道變量的值不會改變。但在圖OS的第一變量的是第二個例子「a」可以是變化
int a = 2;
這個和這個
const int size = a;
您的變量之間 一個可以是可變的。這就是爲什麼你的編譯器不讓你編譯你的代碼。
爲了瞭解更多關於內存管理的基礎知識。我建議你到 https://stackoverflow.com/a/24922/2326288這個評論。
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];
這樣,你就可以申請用動態大小的數組。
'const'並不意味着編譯時常量。 – chris