初探C++数组的size可以是变量
来源:互联网 发布:homefacialpro 知乎 编辑:程序博客网 时间:2024/06/18 14:20
在教材中,关于数组的声明,格式要求是“类型标识符 数组名[常量表达式]”,是的数组的大小,数组的size,强调一定是变量。看过不少的书,都在强调一定要用常量,或者用成const定义的常变量,总之,在声明数组,分配存储空间的时候,size一定是确定的,并且保证以后再不改动。
在辅导学生时,他编的程序中,声明数组居然用变量作size,且错误不在此处。怎么可能?可这是事实。
用下面的简单示例说明,这种程序在CodeBlocks中是可以通过编译的(但在VC++6.0中错误):
#include <iostream>using namespace std;int main(){ int n; cin>>n; int a[n]; for(int i=0; i<n; i++) cin>>a[i]; for(int i=0; i<n; i++) cout<<a[i]<<" "; cout<<endl; return 0;}回家后查各种书,《C++ Primer》还在强调一定是常量表达式,其他书上要么也这么说,要么不强调是常量还是变量。WalterSavitch的《C++程序设计(第8版)》中讲到“数组长度使用变量,对大多数编译器是非法的。”在举例中提到“有的编译(但并非全部)允许用变量指定数组长度。但是为了移植性,不应该这样做,即使目前所用的编译器允许。”
从网上,有人谈到这是从C++99开始增加的新定义。是新的语法特性,多数编译器根本不支持。
作为更新很快的CodeBlocks,支持新标准很正常。
对于这种新语法,试图掌握些规律。用下面的一段程序作为调试,考查变量的值发生变化之后,以及再发生内存分配之后会不会覆盖之类的问题。
#include <iostream>using namespace std;int main(){ int n; n=3; int a[n]; for(int i=0; i<n; i++) cin>>a[i]; for(int i=0; i<n+5; i++) cout<<a[i]<<" "; cout<<endl; n=6; for(int i=3; i<n; i++) cin>>a[i]; for(int i=0; i<n+2; i++) cout<<a[i]<<" "; cout<<endl; int b[n]; for(int i=0; i<n; i++) cin>>b[i]; for(int i=0; i<n+2; i++) cout<<a[i]<<" "; cout<<endl; cout<<endl; return 0;}
程序运行,总体没有发现什么异常,但这并不足以说明程序没有问题,这样做不会出问题。而且,CodeBlocks中对于越界访问也没有加限制,似乎是件好事,但可能就是坏事。这倒是提醒我们,在利用数组时,更加多几份小心了。现在政府职能转变是个热点话题,权力意味着责任,限制少了,不会老卡在编译错误上,但为了保证程序能够安全运行,编程者应该把关更多。
还没有完全搞明白这件事情。但变量作数组声明中的长度,还是少用。如果要使用动态调整大小的数组,明着来,用动态数组或者C++中提供的Array对象,这种影响可移植性的代码,还是少写。
如果以后有闲,倒是可以考察下当初标准为何要做出这样的调整。调整,意味着有些道理,有机会知道下,还是件不错的事。
- 初探C++数组的size可以是变量
- 再探C++数组的size可以是变量
- C语言数组长度可以是一个变量吗?
- C语言的数组可以用变量定义吗?
- C/C++ 数组下标可以是负值
- c/c++ 数组是下标为什么可以是负值
- 在C ++中,可以用于变量和函数上的关键字是哪一个?
- 排序一个数组可以是有用的
- lua 数组的索引可以是负数
- 哈哈,新发现!C语言中是可以有动态数组的!!
- C语言指针变量可以当做数组运用
- Objective-C初探-Objective-C NSLog 显示变量的值
- 你不知道的c语言之为什么数组的大小不能是变量
- SSD盘的sector size是可以用SSD厂商提供的工具来修改的
- 一个数组中的值可以是另一个数组,另一个数组的值也可以是一个数组吗?
- 原来D2007是可以支持类变量的,嘿嘿
- 【JavaScript】变量冲突是可以通过编译的
- 指针可以指向数组size 的下一个, 即just beyond it by one element(non-existent)
- 在MyEclipse10中配置spket支持extjs4.X智能提示
- lucene4.5源码分析系列:搜索过程
- Android 按键调试
- 程序员这条路是否适合我?
- phonegap3.1.0自学笔记03_Android中config.xml配置介绍
- 初探C++数组的size可以是变量
- Java中,String的subString方法易导致内存溢出
- 敏捷爽畅(Agile Fluency)之道
- C++ 多态性与虚函数
- 【算法导论】动态规划之最优二叉查找树
- 第十四周项目4--冒泡法数组排序
- 新炬学院-我的DBA技术生涯感谢有你
- hw 9.16
- nyoj 102 次方求模 快速求幂