数组下标用变量?
书上说不允许变量做数组下标.但是我试验了一下,可以用gcc编译通过,正确运行.#include<stdio.h>main(){intn;scanf("%d",&n);in...
书上说不允许变量做数组下标.但是我试验了一下,可以用gcc编译通过,正确运行.
#include<stdio.h>
main(){
int n;
scanf("%d",&n);
int a[n];
for(int i=0;i<n;i++){
a[i]=i;
printf("%d ",a[i]);
}
}
ivaniren:你把a[n]定义在n前,肯定不通过.
编译器:DEV-C++ 4.992
运行结果如下: 展开
#include<stdio.h>
main(){
int n;
scanf("%d",&n);
int a[n];
for(int i=0;i<n;i++){
a[i]=i;
printf("%d ",a[i]);
}
}
ivaniren:你把a[n]定义在n前,肯定不通过.
编译器:DEV-C++ 4.992
运行结果如下: 展开
7个回答
展开全部
楼主可能稍微理解差了一点点。
从本质上来看定义是这样的
在使用之前一定要定义数组的下标,这时需要一个已知量。
你这题当scanf后n就是一个具体的已知量了
所以a[n]是可以的
在C语言里如果不给定下标大小的话,是没办法使用数组的。要在使用之前给定下标大小就可以了。
如果这个变量是已知就可以了,就相当于一个常量。
我们经常用宏#define N5,其实从严格意义上说也是这个样子的
那就是编译器环境定义不一样吧。现在新版本应该都支持了。
我在dev-c都可以。
而且我在看某些书的时候也有提到这个了。TC太老了,不支持的时候太多了
还有楼主。。。宏。从广义说是这样说的 #define 变量 常量
当然这里的变量是不允许发生改变的。所以我们称之为字符常量 。又一般称这个变量叫下标,而不叫变量。因为这个值是不允许改变的。
我只是想给你做个比方。告诉你像这题里。当你的n输进来后。值也是确定的!!!!!也是一个定值,所以暂时可以当做一个宏。
所以说dev-c是对的。估计是你版本的问题。或者环境差异问题。这个具体还要看编译器。。希望各位大大不要乱喷口水
从本质上来看定义是这样的
在使用之前一定要定义数组的下标,这时需要一个已知量。
你这题当scanf后n就是一个具体的已知量了
所以a[n]是可以的
在C语言里如果不给定下标大小的话,是没办法使用数组的。要在使用之前给定下标大小就可以了。
如果这个变量是已知就可以了,就相当于一个常量。
我们经常用宏#define N5,其实从严格意义上说也是这个样子的
那就是编译器环境定义不一样吧。现在新版本应该都支持了。
我在dev-c都可以。
而且我在看某些书的时候也有提到这个了。TC太老了,不支持的时候太多了
还有楼主。。。宏。从广义说是这样说的 #define 变量 常量
当然这里的变量是不允许发生改变的。所以我们称之为字符常量 。又一般称这个变量叫下标,而不叫变量。因为这个值是不允许改变的。
我只是想给你做个比方。告诉你像这题里。当你的n输进来后。值也是确定的!!!!!也是一个定值,所以暂时可以当做一个宏。
所以说dev-c是对的。估计是你版本的问题。或者环境差异问题。这个具体还要看编译器。。希望各位大大不要乱喷口水
展开全部
对于ANSI 标准C及C++,这都是标准没有定义的,也就是说,最好认为不可以用变量代入数组个数
C99标准中加入了这个特性,但C99标准还未流行。
对于C++编译器,gcc扩充了这个功能,但是它未被标准支持所以这样的程序是不具备编译可移植性的。早期的vc++6.0不支持此特性。
但是你若在c++中定义const int n = 5;
则可以int a[n];
因为c++中,const型变量是作为编译时常量的。
但在ANSI C中却不行,因为C中const型变量是作为只读的变量出现的,所以不能用其定义数组个数
虽然在汇编的角度看,int a[n];这种语句即使n是变量,也是很好实现的,但c/c++出于多种考虑(例如n的不确定性以及楼上提到的一点原因)拒绝了它
要模拟动态数组,最好使用new,malloc类似函数动态分配内存,这样的程序才是最安全的
-----------------------------------------------------------------
楼主,我看大师Steve Summit的书,他告诉我说去在意不同的编译器之间的对标准的支持程度的不同是没多大意义的。我们只需知道ANSI C/C++两者的标准定义行为,对未定义行为及不确定行为不同的编译器有不同的实现与扩展,也尽量不要去用,尽管某些编译器出于好意扩展了某些行为
-------------------------------------------------------------
这里看到了对宏的讨论。宏是预处理器管的范畴,而非编译器的范畴
要想真正理解以上所有这些,请看大师的书:《C Programming FAQs》与《C++ Primer》,前者对应C,后者对应C++。
单在这里讨论是理解不了的
C99标准中加入了这个特性,但C99标准还未流行。
对于C++编译器,gcc扩充了这个功能,但是它未被标准支持所以这样的程序是不具备编译可移植性的。早期的vc++6.0不支持此特性。
但是你若在c++中定义const int n = 5;
则可以int a[n];
因为c++中,const型变量是作为编译时常量的。
但在ANSI C中却不行,因为C中const型变量是作为只读的变量出现的,所以不能用其定义数组个数
虽然在汇编的角度看,int a[n];这种语句即使n是变量,也是很好实现的,但c/c++出于多种考虑(例如n的不确定性以及楼上提到的一点原因)拒绝了它
要模拟动态数组,最好使用new,malloc类似函数动态分配内存,这样的程序才是最安全的
-----------------------------------------------------------------
楼主,我看大师Steve Summit的书,他告诉我说去在意不同的编译器之间的对标准的支持程度的不同是没多大意义的。我们只需知道ANSI C/C++两者的标准定义行为,对未定义行为及不确定行为不同的编译器有不同的实现与扩展,也尽量不要去用,尽管某些编译器出于好意扩展了某些行为
-------------------------------------------------------------
这里看到了对宏的讨论。宏是预处理器管的范畴,而非编译器的范畴
要想真正理解以上所有这些,请看大师的书:《C Programming FAQs》与《C++ Primer》,前者对应C,后者对应C++。
单在这里讨论是理解不了的
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
您好
如果使用数组时,使用变量做角标,是绝对可以的,不然数组就是去了它的意义,完全没有存在的必要了,您放心使用就可以了。
您的书可能是说定义的时候不可以用变量。这就要看您的编译环境了 vc是不可以的,高版本的gc
c都是可以的
注意:
这样写不规范,尽量避免
如果使用数组时,使用变量做角标,是绝对可以的,不然数组就是去了它的意义,完全没有存在的必要了,您放心使用就可以了。
您的书可能是说定义的时候不可以用变量。这就要看您的编译环境了 vc是不可以的,高版本的gc
c都是可以的
注意:
这样写不规范,尽量避免
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
比如有一个数组:arr[5]={6,7,8,9,10};
当你要用到这个数组第二个元素时,你就可以用arr[1]来代表第二个元素7,这里的1就是下标变量。变量与下标变量的区别在于:下标变量只能是一个非负的整型值,而变量即可以表示正数也可以表示负数。第二,变量表示的数值可以很大,但下标变量表示的值是有一定范围的。比如说上面这个数组,它的下标的范围就只能是0-4,如果你要用6作这它的下标,就会出现错误。因为编译器在这个数组里找不到这个元素。记住:在C/C++里所有数组的下标都是从0开始的
当你要用到这个数组第二个元素时,你就可以用arr[1]来代表第二个元素7,这里的1就是下标变量。变量与下标变量的区别在于:下标变量只能是一个非负的整型值,而变量即可以表示正数也可以表示负数。第二,变量表示的数值可以很大,但下标变量表示的值是有一定范围的。比如说上面这个数组,它的下标的范围就只能是0-4,如果你要用6作这它的下标,就会出现错误。因为编译器在这个数组里找不到这个元素。记住:在C/C++里所有数组的下标都是从0开始的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
理论上不可以,在编辑时刻编辑器并不知道变量的值,只有用预定义常量才可以. gcc好象不是很符合C标准,标准上说变量声明要在其他语句前,你这里数组变量声明却在scanf后,说明gcc容许出现这些用法,但标准并不提倡,因为一但改变环境将无法运行
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询