数组初始化在C++中使用 const 变量

Array initialization use const variable in C++

本文关键字:const 变量 初始化 C++ 数组      更新时间:2023-10-16
  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也将在运行时初始化,并且不再是编译时常量。