根据C ++规则是合法的吗?

时间:2012-06-21 18:34:01

标签: c++ arrays

  

可能重复:
  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,编译器或任何其他东西???

使用较新或较旧的书籍会导致此类问题吗?

4 个答案:

答案 0 :(得分:8)

代码格式不正确。数组的范围必须是常量表达式,i不是常量表达式(它未声明为const)。

如果a被声明为const int并使用常量表达式初始化(​​如7),则代码将是格式良好的,因为范围将是一个常量表达式。例如,以下是格式良好的:

int main()
{
    int const a = 7;
    char arr[a];
}

某些C ++编译器(包括gcc,在某些编译模式下)支持可变长度数组,这是C的一个特性,它允许本地数组具有非常量大小。但是,提供此功能的编译器会将其作为语言扩展;它不是C ++的一个特性。

答案 1 :(得分:1)

C99ISO/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表达。