C++ 数组初始化使用C++;
这可以起到以下作用:C++ 数组初始化使用C++;,c++,arrays,constants,C++,Arrays,Constants,这可以起到以下作用: const int size = 2; int array[size] = {0}; 这有一个编译错误: int a = 2; const int size = a; int array[size] = {0}; 为什么?因为在第一种情况下,size在编译时由编译器初始化。在第二种情况下,代码> A/COD>可以在运行时初始化,因此Stime也将在运行时初始化,不再是编译时常数。,因为C++委员会的成员决定了。 技术原因是用于初始化size的第一个表达式是一个常量
const int size = 2;
int array[size] = {0};
int a = 2;
const int size = a;
int array[size] = {0};
为什么?因为在第一种情况下,
size
在编译时由编译器初始化。在第二种情况下,<>代码> A/COD>可以在运行时初始化,因此,因为C++委员会的成员决定了。 技术原因是用于初始化
size
的第一个表达式是一个常量表达式,可以在编译期间进行计算。这意味着编译器还可以知道数组将有多大,并且可以在编译时完成分配(在本例中,“保留”可能是一个更合适的术语)
第二种情况下,表达式不是常数表达式(给定C++定义),这种反变换是不可能的。 在第二种情况下,值在
size
初始化时确实是固定的,这一事实与此完全无关。规则基于“表达式类型”,第二个表达式使用可变变量,因此编译器将其视为非常量
允许第二种形式进行编译时初始化需要进行流分析,因为它需要区分
int a = 2;
const int size = a;
及
其中涉及
大小的表达式实际上是相同的。它将涉及内存管理
<>当OS因为C++的性质而试图运行程序时,OS会想知道<强>堆栈>区域的确切空间。在第一个示例中,OS将知道变量的值不会改变。但对于第二个例子,在操作系统视图中,第一个变量“a”可以在
int a = 2;
这个和这个
const int size = a;
变量a可以是可变的。这就是为什么你的编译器不允许你编译你的代码
以了解更多有关内存管理的基础知识。我建议你
这一评论
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
并不意味着编译时常量。因此,如果这个大小不是那样初始化的,就没有办法初始化一个具有已知大小的数组了?
int a = 2;
int size = a;
int* array = new int[size];