C++为什么数组成员数不能用变量定义?

c++ primer plus 第6版上说的,比如 int a[b](b为变量) 是不可以的,而只能为常量,因为编译时需要是已知的,而它又说可以int a[sizeof(int)],这个表达式不是需要进行运算才能知道结果吗?在编译的时候应该是不知道的吧?和变量不能用于里面不是一回事吗?这是为什么?

sizeof是在编译时由编译器根据表达式类型计算所占空间,不是在运行时。

假如int是占4个字节,那么表达式sizeof( int )在编译后被替换为常量4。

用变量定义数组是C语言的C99支持,但是C++目前的标准也没支持这种语法(C++14我就不知道了),不过GNU C++标准(G++编译器)可以使用变量定义数组。追问

为什么不能用变量来定义呢?是规定,还是有不能实现的地方?

追答

C++标准禁止用变量定义数组的。主要是因为性能上的原因吧,编译时确定数组的大小,可以优化数组的分配速度和存取速度。

而且如果要使用动态数组的话,使用std::vector模板是很好的选择。

温馨提示:内容为网友见解,仅供参考
第1个回答  2014-09-08
int的长度是定值啊,不然照楼主的理解a[2+3]里面还不是要运算的。。括号里面只要是常量或者常量表达式即可。。
第2个回答  2014-09-08

sizeof是关键字并非函数,

sizeof(int) 或写成 sizeof int

在编译阶段就可以确定大小。编译器读取到sizeof关键字就会算出后面类型所占的空间大小。

追问

为什么不能用变量?

追答

当然可以用变量,但C语言变量类型是显式定义的,因此变量类型是知道的。sizeof后面跟变量与跟类型是等价的。如下所示:

int a;
int b[sizeof a];  // 编译阶段知道a是整型int,sizeof(a)可以计算int所占空间,
int c[2];
int d[sizeof c];  // c是int [2],sizeof(c)算出int [2]所占空间大小

追问

不是,我是问为什么int a[b](b是变量)为什么不可以

追答

设计理念如此,C是以硬件模型作为自己的编程模型,在编译阶段确定数组大小比较合适。
不过C99标准之后支持动态数组了。

第3个回答  2014-09-08
sizeof(int)就其实就等于4,是常量不是变量,当然可以int a[sizeof(int)]。
第4个回答  2014-09-08
sizeof(int)的结果是编译期常量,所以可以用来定义数组。追问

为什么不能用变量?

追答

c99支持数组大小为变量,但是有限制,不能定义一个具有静态生命周期的可变数组,理由是静态存储在编译时必须确定。

另一方面是效率问题,如果数组的大小在编译器确定,那么编译器就可以对循环遍历数组的代码进行优化,最常见的是循环展开,这样可以在数组大小不大的情况下,消除分支。而可变数组不能做到这种优化,毕竟数组大小只在运行时可以确定。

C++ 使用变量声明数组长度
C++中无法使用变量作为数组长度,必须使用常量。原因在于数组空间分配在栈内存中,这部分空间大小必须在编译时就确定,不能等到运行时再分配。常量值在编译时就确定,而变量须运行时才能确定。因此,若要使用变量声明数组长度,可以选择将数组空间开辟在堆内存中。采用这种方法,虽然灵活性增强,但在内存管理...

为什么在c++中定义数组时数组的常量表达式不能包含变量?
但不管是什么,都原理一样,以数组大小为例,在C++中,有些变量是在编译期间,编译器就给分配空间的,有的是运行时候才分配空间,对于编译期间就分配空间的变量,编译器一定要知道它是多少长度的,才能分配适合那个长度的空间,静态数组,临时变量,全局变量之类都是这样。你放变量在里面,当然编译期间都...

请问C++的字符串string类为什么数组中不能为变量?
因为数组在C++中是静态存在的,它占用一定的空间(也就是固定长度),在数组当前所在函数运行中是不能改变其长度的(函数结束就消失),一旦改变了长度,数组所在内存区就会出现空缺,导致出错!你在int n=5之前不添加const声明为常变量,系统将认为你“企图”在运行中修改数组长度,所以不予通过。

数组长度为什么不能是变量
数组的大小不能用变量表示的,是因为在编译连接期间内存要按照你制定的长度给数组分配相应的内存空间,如果是变量的话就没有办法给它分配了,你可以用符号常量来解决,在开头用:define m 100 define n 100 然后在程序中就可以定义u[m][n]二维数组了,当不一定非要是100,可以是任何一个正整数。C...

C语言中数组长度不能用变量定义吗?
C语言里,所有变量空间都是在程序运行之初向系统申请的,包括指针,除了一些动态申请方式如malloc函数。没有申请的空间系统是不允许读写的。那么如果一个数组大小是变量定义,则在程序运行前不能确定数组大小,也就无法申请,故不允许。所以,解决的办法便是通过malloc函数,即 int a[n];可改为 int* ...

为什么c++中声明数组时可以用变量而c却不行?
因为数组是确定大小的,在c++和c中都不能以变量声明,但可以采用以下方式:#define n 5int a[n];此时宏定义n为5,在程序编译时就已确定n.

C\/C++变量定义数组长度问题
纯C编译器是不允许用变量定义数组长度的,编译都过不了。而后来的有些C++的编译器允许这样做的,但大多数用来做定义数组长度的变量要用const修饰,叫值不变变量,但纯C编译器即使用const修饰的变量也不允许用来定义数组长度。你说的“C和C++”都是允许的可能是你的编译器是C++兼容C的,时下纯C编译...

在定义数组时,数组大小必须是常量,不能使变量或变量表达式
实际上可以通过指针对其值进行修改,比如int *p=&n; *p=12; 这样那个就修改了n的值(将&n赋值给p的时候编译器可能会发出警告),所以n是一个变量,是一个特殊的变量,被称为常变量。因此,n不是一个常量,只是一个不能通过n来修改其值的一个变量。所以不能用它来给定数组的大小。

c++中数组的下标可以是变量吗?
1、C89\/C90标准:定义数组时下标只允许使用整型、字符型常量,引用数组时下标可以使用整型、字符型的常量或者变量 2、C99标准:定义数组时下标可以使用整型、字符型的常量或变量,但变量必须已经赋值;引用数组时下标可以使用整型、字符型的常量或者变量。以上所说的常量及变量均包含表达式。

C++中定义数组时报错,数组大小为0。
对于数组的定义,必须为常数大小,不能用变量来定义大小的。int M=N*N;int t[M];上面定义的M是一个变量,肯定会报错。你可以在 main()前面宏定义一下。加一句: #define M 25 或采用动态分配数组大小,new,delete都就行了。

相似回答