[英]Array initialization use const variable in 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
的表達式確實相同。
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];
因此,您可以申請具有動態大小的數組。
這是關於內存管理。
當操作系統因為 C++ 的特性而試圖運行你的程序時,操作系統會想要知道堆棧區域的確切空間。 在第一個示例中,操作系統會知道變量的值不會改變。 但是對於操作系統的第二個例子,你的第一個變量“a”可以在
int a = 2;
這個和這個
const int size = a;
您的變量 a 可以更改。 這就是為什么您的編譯器不允許您編譯代碼的原因。
為了了解更多關於內存管理基礎知識。 我推薦你https://stackoverflow.com/a/24922/2326288這個評論。
因為在第一種情況下, size
是在編譯時由編譯器初始化的。 在第二種情況下, a
可能在運行時初始化,因此size
也將在運行時初始化,不再是編譯時常量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.