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

时间:2013-09-25 04:31:11

标签: c++ arrays const

  1. 这可行:

    const int size = 2;
    int array[size] = {0}; 
    
  2. 这有编译错误:

    int a = 2;
    const int size = a;
    int array[size] = {0};
    
  3. 为什么?

4 个答案:

答案 0 :(得分:8)

因为C ++委员会的成员决定如此。

技术原因是用于初始化size的第一个表达式是一个常量表达式,它可以在编译期间计算。这意味着编译器也可以知道数组的大小,并且可以在编译时完成分配(在本例中“预留”可能是更合适的术语)。

在第二种情况下,表达式不是常量表达式(给定C ++定义),并且无法进行此重新保存。

在第二种情况下,值被size初始化时确实固定的事实完全无关紧要。规则基于“表达式”,第二个表达式使用可变变量,因此编译器认为它是非常量的。

允许第二种形式进行编译时初始化需要进行流分析,因为它需要区分

int a = 2;
const int size = a;

int a = foo();
const int size = a;

其中涉及size的表达式确实相同。

答案 1 :(得分:5)

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];

因此,您可以申请动态大小的数组。

答案 2 :(得分:2)

这是关于记忆管理的。

当OS因为C ++的性质而试图运行你的程序时,OS会想知道 stack 区域的确切空间。在第一个例子中,操作系统会知道变量的值不会改变。但是对于OS的第二个例子,你的第一个变量“a”可以在

之间改变
int a = 2;

这个和这个

const int size = a;

你的变量a可以改变。这就是你的编译器不允许你编译代码的原因。

了解有关内存管理基础知识的更多信息。我建议你 https://stackoverflow.com/a/24922/2326288此评论。

答案 3 :(得分:0)

因为在第一种情况下,编译器在编译时初始化size。在第二种情况下,{em} 编译时常量。