可以更改的const变量可用于在C和C ++中声明和定义数组吗?

问题描述 投票:1回答:2

请看下面的代码:

#include <iostream>
int main(void) {
    int  number1 = 4;
    double salary[number1];
    return 0;
}

尽管可以成功编译,但由于number1是非const变量,因此应认为是错误的。

#include <iostream>

int main(void) {
    int  number1 = 4;

    const unsigned number2 = number1;
    double salary[number2];

    return 0;
}

现在number2是一个const变量。

也已成功编译。

我认为这是错误的,或者至少不是好的做法。

但是我无法解释原因。

有人可以解释为什么错了吗?

c++ c arrays const
2个回答
8
投票

可以更改的const变量可以用于在... C ++中声明和定义数组吗?

编号

尽管可以成功编译

...由扩展语言的编译器组成。无法保证可以被其他编译器编译。

因为number1是非常量变量。

间接排序。确切的原因是number1不是常数表达式。在this情况下,使变量const足以使示例格式正确,因为变量的初始化程序是一个常量表达式。

现在number2是一个const变量。

也已成功编译。

我认为这是错误的

您的感觉是正确的。该程序仍然格式不正确。由于需要一个符合标准的编译器来告诉您(您可以使用-pedantic选项要求GCC符合该标准):

warning: ISO C++ forbids variable length array 'salary' [-Wvla]
double salary[number2];
       ^~~~~~

有人可以解释为什么错了吗?

这是错误的,因为数组的大小不是语言所要求的常数表达式。

常量变量的标识符不一定是常量表达式。变量必须为const,变量的初始化程序必须为常量表达式。 4是一个常数表达式。非常量变量的标识符不是常量表达式。如果该值是在运行时确定的,则它不能是一个常量表达式。


可以更改的const变量可用于在C中声明和定义数组吗??

可能是。在C99之前,出于与C ++答案中所述相同的原因,没有。

在C99中,是的,因为该语言引入了可变长度数组。从C11开始,如果编译器支持,则为是。 VLA在此标准中成为可选。


1
投票

可以更改的const变量可用于在C和C ++中声明和定义数组的[大小]吗?

在C编程语言中,variable length array是变量大小数组的声明。花括号int array[here]中的表达式不是常量表达式,并且在运行时进行评估(并且必须始终将其评估为大于零的值)。它是C99标准的一部分。

VLA不是C ++的一部分,在C ++中无效,但是某些编译器在C ++中也支持可变长数组作为编译器扩展。

© www.soinside.com 2019 - 2024. All rights reserved.