9

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

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

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

假设如果我们使用

int i = 3;
float f[i];

有用。

第一种情况有什么问题?

谢谢。

4

4 回答 4

15

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

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

然而,这两种情况通常都会被 GCC 接受,因为它支持 C99 风格的运行时大小的数组作为 C++ 中的扩展。将标志传递-pedantic给 GCC 以使其抱怨。

编辑: C++ 标准术语是“整数常量表达式”,符合条件的内容在标准的第 5.19 节中有详细描述。确切的规则是不平凡的,C++11 有更广泛的符合条件的事物constexpr,但在 C++98 中,合法事物的列表大致是:

  • 整数文字
  • 仅包含常量的简单表达式
  • 整数类型的非类型模板参数
  • const声明为并用常量表达式初始化的整型变量
于 2013-09-25T13:49:51.237 回答
3

您的第二个示例不起作用,也不应该起作用。 i必须是恒定的。这有效

const int i = 3;
float f[i];
于 2013-09-25T14:02:15.850 回答
2

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

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

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完成后清理它)。

于 2013-09-25T14:04:14.557 回答
0

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

于 2013-09-25T14:12:22.203 回答