【问题标题】:Can a const variable which can change be used to declare and define an array in C and C++?可以更改的 const 变量可以用于在 C 和 C++ 中声明和定义数组吗?
【发布时间】:2020-03-15 23:39:50
【问题描述】:

看下面的代码:

#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++ 是系统底层物理架构的编译语言。像intconst(尤其是后者)这样的类型和限定符是为了帮助人类程序员而创建的。所以如果你觉得它没有表达你想要的意思,那么千万不要使用那种语法。从这个意义上说,它可以被认为是“不好的做法”旁注:考虑函数alloca
  • 我觉得这是一个完美的骗局stackoverflow.com/a/34696833/2805305,除了这个q还询问C。尽管如此,请在那里阅读我的回答,因为它完全符合您的问题。
  • 以后,请在不同的问题中提出不同的问题(包括涉及不同语言的相同问题)。
  • C 和 C++ 是不同的语言,它们都有自己独特的规范,这些规范随着时间的推移而发展——根据语言和规范,可能会定义或不定义您想要的数组。此外,仅仅因为您觉得它是错误的,这并不意味着它是不好的做法——某些硬件可能恰好适合您感觉“错误”的那种构造。所以没有人能解释为什么它是错的,因为它可以说是没有[错的]。反过来也是正确的——它不是“正确的”——它只是可能被允许的,并且需要根据具体情况评估影响。

标签: c++ c arrays constants


【解决方案1】:

可以改变的 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 是可选的。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-29
      • 2013-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多