看到这个代码
#include<iostream>
int main
{
using namespace std;
int a=7;
char arr[a];
return 0;
}
在我的书中写到 array_size 必须是一个常量,但 codeblocks 没有给出错误......
这不是唯一的情况..还有其他几个例子。
谁是错误的IDE,编译器或任何其他东西???
使用新书或旧书会导致这样的问题吗?
看到这个代码
#include<iostream>
int main
{
using namespace std;
int a=7;
char arr[a];
return 0;
}
在我的书中写到 array_size 必须是一个常量,但 codeblocks 没有给出错误......
这不是唯一的情况..还有其他几个例子。
谁是错误的IDE,编译器或任何其他东西???
使用新书或旧书会导致这样的问题吗?
代码格式不正确。数组的范围必须是常量表达式,而i
不是常量表达式(未声明const
)。
如果a
声明为 aconst int
并使用常量表达式(如 )进行初始化7
,则代码格式正确,因为范围将是常量表达式。例如,以下是格式良好的:
int main()
{
int const a = 7;
char arr[a];
}
一些 C++ 编译器(包括 gcc,在某些编译模式下)支持可变长度数组,这是 C 的一个特性,它允许本地数组具有非常量大小。但是,提供此功能的编译器将其作为语言扩展;它不是 C++ 的特性。
由于C99(ISO/IEC 9899:1999 ,第 6.7.5.2 节),这在C中是合法的:arr
是可变长度数组 (VLA)。但是,C++中没有 VLA。这里接受的答案解释了原因。
它在 C++98、C++03、C++11、C89 和 C90 中是非法的(可能在 C11 中也是如此)。
它仅在 C99 中是合法的。
根据标准,这是不合法的,这里:
C++03 8.3.4/1 [dcl.array]
在声明 T D 中,其中 D 具有
D1 [constant-expressionopt]
声明 T D1 中标识符的形式和类型是“派生声明符类型列表 T”,则 D 的标识符的类型是数组类型。T称为数组元素类型;此类型不应是引用类型、(可能是 cv 限定的)类型 void、函数类型或抽象类类型。如果常量表达式 (5.19) 存在,它应该是一个整数常量表达式并且它的值应该大于零。[...]
积分常数表达式在 5.19/1 中进一步定义:
[...] 整数常量表达式只能涉及文字(2.13),枚举数,常量变量或整数或枚举类型的静态数据成员,用常量表达式(8.5)初始化,整数或枚举类型的非类型模板参数,和 sizeof 表达式。