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>可以在运行时初始化,因此Stime也将在运行时初始化,不再是编译时常数。

    ,因为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];