我是C ++的新手。我正在阅读一本C ++书,它说
const int i[] = { 1, 2, 3, 4 };
float f[i[3]]; // Illegal
它说在编译期间浮点变量的声明是无效的。为什么?
假设我们使用
int i = 3;
float f[i];
有效。
第一种情况有什么问题?
感谢。
答案 0 :(得分:15)
所以第一个是非法的,因为一个数组必须有一个编译时已知的绑定,i[3]
虽然严格地说在编译时已知,但不符合语言为“编译时已知”设置的标准
由于同样的原因,第二种也是非法的。
但是,这两种情况通常都会被GCC接受,因为它支持C99样式的运行时大小的数组作为C ++中的扩展。将-pedantic
标志传递给GCC以使其抱怨。
编辑: C ++标准术语是“整数常量表达式”,符合条件的内容将在标准的第5.19节中详细介绍。确切的规则是非平凡的,C ++ 11具有更广泛的由于constexpr
而有资格的事物,但在C ++ 98中,合法事物的列表大致是:
const
并用常量表达式答案 1 :(得分:3)
你的第二个例子不起作用,它应该不起作用。
i
必须保持不变。这工作
const int i = 3;
float f[i];
答案 2 :(得分:2)
只是为了阐述塞巴斯蒂安的回答:
创建静态数组时,编译器必须知道需要保留多少空间。这意味着在编译时必须知道数组大小 。换句话说,它必须是文字或常数:
const int SIZE = 3;
int arr[SIZE]; // ok
int arr[3]; // also ok
int size = 3;
int arr[size]; // Not OK
由于size
的值在创建数组时可能会有所不同,因此编译器将不知道为数组保留多少空间。如果您将其声明为const
,则它知道该值不会更改,并且可以保留适当的空间量。
如果您需要一个可变大小的数组,则需要使用new
动态创建它(并确保在完成后使用delete
进行清理)。
答案 3 :(得分:0)
对于长度仅在C ++运行时知道的数组,我们有std::vector<T>
。对于内置数组,必须在编译时知道大小。对于C ++ 11也是如此,尽管更老的C99标准已经支持动态堆栈数组。另请参阅Why doesn't C++ support dynamic arrays on the stack?