初探C++数组的size可以是变量
2013-11-26 21:38
411 查看
在教材中,关于数组的声明,格式要求是“类型标识符 数组名[常量表达式]”,是的数组的大小,数组的size,强调一定是变量。看过不少的书,都在强调一定要用常量,或者用成const定义的常变量,总之,在声明数组,分配存储空间的时候,size一定是确定的,并且保证以后再不改动。
在辅导学生时,他编的程序中,声明数组居然用变量作size,且错误不在此处。怎么可能?可这是事实。
用下面的简单示例说明,这种程序在CodeBlocks中是可以通过编译的(但在VC++6.0中错误):
作为更新很快的CodeBlocks,支持新标准很正常。
对于这种新语法,试图掌握些规律。用下面的一段程序作为调试,考查变量的值发生变化之后,以及再发生内存分配之后会不会覆盖之类的问题。
程序运行,总体没有发现什么异常,但这并不足以说明程序没有问题,这样做不会出问题。而且,CodeBlocks中对于越界访问也没有加限制,似乎是件好事,但可能就是坏事。这倒是提醒我们,在利用数组时,更加多几份小心了。现在政府职能转变是个热点话题,权力意味着责任,限制少了,不会老卡在编译错误上,但为了保证程序能够安全运行,编程者应该把关更多。
还没有完全搞明白这件事情。但变量作数组声明中的长度,还是少用。如果要使用动态调整大小的数组,明着来,用动态数组或者C++中提供的Array对象,这种影响可移植性的代码,还是少写。
如果以后有闲,倒是可以考察下当初标准为何要做出这样的调整。调整,意味着有些道理,有机会知道下,还是件不错的事。
在辅导学生时,他编的程序中,声明数组居然用变量作size,且错误不在此处。怎么可能?可这是事实。
用下面的简单示例说明,这种程序在CodeBlocks中是可以通过编译的(但在VC++6.0中错误):
#include <iostream> using namespace std; int main() { int n; cin>>n; int a ; 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 ; 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 ; 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可以是变量
- 《Swift 函数可以作为变量》
- Java反射机制(只可以访问公有的方法或者变量)
- DSP调试通过,可以运行,观测变量数据为-1.#QNAN的原因
- 在tomcat的server.xml下面配置一次工程变量,那么可以不用每次都对该工程进行配置,只需要启动服务器就行
- 被static修饰的成员变量可以被修改吗
- yyuc视图未更新,控制器修改可以看到,视图无法更新,提示Allowed memory size of exhausted
- 可以用save name x y 保存工作空间变量 x y到文件 name.mat
- 讨论 innodb_log_block_size 变量
- 初探C# 3.0 (1) - 隐式类型变量, 扩展方法, Lambda表达式
- JS replace()方法替换变量(可以对变量进行全文替换)
- Java序列化时,静态的成员变量 "可以被拿到数据" 是因为 类加载器之前就把这个类加载好了,拿到的是加载好的数据
- JDK安装成功了,环境变量也配置好了,测试代码也可以运行,但是打不开eclipse
- SpringMVC Controller函数参数问题(就是作为方法的参数,以类名小写开头可以在JSP页面中获得该变量的数据 )
- &符号不能被用于左值, 全局变量的地址是唯一的, 不可以修改的一个左值
- c#实验笔记- params关键字可以指定可变数目的变量 for循环可以初始化多个参数
- final关键字可以用来修饰类、方法、变量、参数,不能修饰抽象类和接口
- 安装完exe版本jdk之后未配置java_home和path环境变量仍然可以在cmd中使用java命令原因解释
- 结构体内可以包含自身的指针(链表实现方法)或 引用 但不可以包含自身变量即递归 (因为这样一来结构体大小就无法确定了)
- 为什么异或运算可以实现两个整数的交换,而无需借助第3个临时变量