常量在 C++ 中的用法

usage of const in c++

本文关键字:用法 C++ 常量      更新时间:2023-10-16

我是C++新手。我正在读一本C++书,上面写着

const int i[] = { 1, 2, 3, 4 };
float f[i[3]]; // Illegal

它说浮点变量的声明在编译期间无效。为什么?

假设如果我们使用

int i = 3;
float f[i];

它有效。

第一种情况有什么问题?

谢谢。

所以第一个是非法的,因为数组必须有一个编译时已知的边界,而i[3]虽然严格来说在编译时已知,但不符合语言为"编译时已知"设置的标准。

出于同样的原因,第二种也是非法的。

但是,GCC 通常会接受这两种情况,因为它支持 C99 样式的运行时大小的数组作为 C++ 中的扩展。将-pedantic标志传递给 GCC 以使其投诉。

编辑:C++标准术语是"积分常量表达式",标准第5.19节详细描述了符合条件的事物。确切的规则是不平凡的,C++11 有更广泛的事情,由于constexpr而符合条件,但在 C++98 中,法律事物的列表大致是:

  • 整数文本
  • 仅涉及常量的简单表达式
  • 积分型非类型模板参数
  • 声明为 const 并使用常量表达式初始化的整型变量

你的第二个例子不起作用,它不应该工作。 i必须是常量的。这行得通

const int i = 3;
float f[i];

只是为了阐述塞巴斯蒂安的回答:

创建静态数组时,编译器必须知道需要保留多少空间。 这意味着数组大小必须在编译时知道。 换句话说,它必须是文字或常量:

const int SIZE = 3;
int arr[SIZE]; // ok
int arr[3]; // also ok
int size = 3;
int arr[size]; // Not OK

由于创建数组时size的值可能会有所不同,因此 oompiler 将不知道为数组保留多少空间。 如果将其声明为 const ,它知道该值不会更改,并且可以保留适当的空间量。

如果你需要一个可变大小的数组,你需要使用new动态地创建它(并确保在完成它时用delete清理它(。

对于长度仅在运行时已知的数组,C++我们有std::vector<T> .对于内置数组,必须在编译时知道大小。对于 C++11 也是如此,尽管更旧的 C99 标准已经支持动态堆栈数组。 另请参阅为什么C++不支持堆栈上的动态数组?