繁体   English   中英

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

[英]Can a const variable which can change be used to declare and define an array in C and C++?

看下面的代码:

#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++ 中声明和定义数组吗?

不。

虽然可以编译成功

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

因为 number1 是非 const 变量。

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

现在 number2 是一个常量变量。

也编译成功。

我觉得不对

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

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

有人可以解释为什么它是错误的吗?

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

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


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

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

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

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

在 C 编程语言中, 可变长度数组是对可变大小数组的声明。 大括号int array[here]内的表达式不是常量表达式,在运行时计算(并且必须始终计算为大于零的值)。 它是 C99 标准的一部分。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM