首页 > 解决方案 > 可以使用可以更改的 const 变量在 C 和 C++ 中声明和定义数组吗?

问题描述

看下面的代码:

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

虽然它可以成功编译,但它应该被认为是错误的,因为 number1 是非常量变量。

#include <iostream>

int main(void) {
    int  number1 = 4;

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

    return 0;
}

现在 number2 是一个 const 变量。

也编译成功。

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

但我无法解释为什么。

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

标签: c++carraysconstants

解决方案


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

不。

虽然可以编译成功

...通过扩展语言的编译器。不能保证它可以被其他编译器编译。

因为 number1 是非常量变量。

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

现在 number2 是一个 const 变量。

也编译成功。

我觉得不对

你的感觉是对的。该程序仍然格式不正确。作为一个符合标准的编译器需要告诉你(你可以通过使用选项让 GCC 符合标准-pedantic):

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

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

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

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


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

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

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


推荐阅读