可能重复:
In C++ books, array bound must be constant expression, but why the following code works?
请参阅此代码
#include<iostream>
int main
{
using namespace std;
int a=7;
char arr[a];
return 0;
}
在我的书中写道,array_size必须是一个常量,但是代码块没有给出错误......
这不是唯一的例子..还有其他一些例子。
谁是错误的IDE,编译器或任何其他东西???
使用较新或较旧的书籍会导致此类问题吗?
答案 0 :(得分:8)
代码格式不正确。数组的范围必须是常量表达式,i
不是常量表达式(它未声明为const
)。
如果a
被声明为const int
并使用常量表达式初始化(如7
),则代码将是格式良好的,因为范围将是一个常量表达式。例如,以下是格式良好的:
int main()
{
int const a = 7;
char arr[a];
}
某些C ++编译器(包括gcc,在某些编译模式下)支持可变长度数组,这是C的一个特性,它允许本地数组具有非常量大小。但是,提供此功能的编译器会将其作为语言扩展;它不是C ++的一个特性。
答案 1 :(得分:1)
自C99(ISO/IEC 9899:1999,第6.7.5.2节)以来,这在 C 中是合法的:arr
是一个可变长度数组(VLA)。但是,there is no VLA in C++。接受的答案here解释了原因。
答案 2 :(得分:0)
在C ++ 98,C ++ 03,C ++ 11,C89和C90(可能也在C11中)都是非法的。
仅在C99中合法。
答案 3 :(得分:0)
根据标准,这是不合法的,在这里:
C ++ 03 8.3.4 / 1 [dcl.array]
在声明T D中,D的格式为
D1 [constant-expressionopt]
并且声明T D1中的标识符的类型是 “derived-declarator-type-list T”,然后是D的标识符的类型 是一种数组类型。 T称为数组元素类型;这种类型 不是引用类型,(可能是cv-qualified)类型void,a 函数类型或抽象类类型。如果是常量表达式 (5.19)存在,它应是一个整数常数表达式 值应大于零。 [...]
积分常数表达式在5.19 / 1中进一步定义:
[...]一个整数常量表达式只能涉及文字 (2.13),枚举器,const变量或静态数据成员 使用常量表达式初始化的整数或枚举类型 (8.5),整数或枚举类型的非类型模板参数, 和sizeof表达。