簡體   English   中英

數組初始化在C++中使用const變量

[英]Array initialization use const variable in C++

  1. 這可以工作:

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

     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.

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