请看下面的代码:
#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变量。
也已成功编译。
我认为这是错误的,或者至少不是好的做法。
但是我无法解释原因。
有人可以解释为什么错了吗?
可以更改的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在此标准中成为可选。
可以更改的const变量可用于在C和C ++中声明和定义数组的[大小]吗?
在C编程语言中,variable length array是变量大小数组的声明。花括号int array[here]
中的表达式不是常量表达式,并且在运行时进行评估(并且必须始终将其评估为大于零的值)。它是C99标准的一部分。
VLA不是C ++的一部分,在C ++中无效,但是某些编译器在C ++中也支持可变长数组作为编译器扩展。