2

可能重复:
在 C++ 书籍中,数组绑定必须是常量表达式,但为什么下面的代码有效?

看到这个代码

#include<iostream>
int main
{
using namespace std;
int a=7;
char arr[a];
return 0;
}

在我的书中写到 array_size 必须是一个常量,但 codeblocks 没有给出错误......

这不是唯一的情况..还有其他几个例子。

谁是错误的IDE,编译器或任何其他东西???

使用新书或旧书会导致这样的问题吗?

4

4 回答 4

8

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

如果a声明为 aconst int并使用常量表达式(如 )进行初始化7,则代码格式正确,因为范围将是常量表达式。例如,以下是格式良好的:

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

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

于 2012-06-21T18:37:54.960 回答
1

由于C99ISO/IEC 9899:1999 ,第 6.7.5.2 节),这在C中是合法的:arr是可变长度数组 (VLA)。但是,C++中没有 VLA这里接受的答案解释了原因。

于 2012-06-21T18:44:10.580 回答
0

它在 C++98、C++03、C++11、C89 和 C90 中是非法的(可能在 C11 中也是如此)。

它仅在 C99 中是合法的。

于 2012-06-21T18:49:41.853 回答
0

根据标准,这是不合法的,这里:

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 表达式。

于 2012-06-21T18:50:26.093 回答