再探C++数组的size可以是变量
来源:互联网 发布:ec销售软件 编辑:程序博客网 时间:2024/05/22 10:46
学生在QQ群中贴图:
他说:“老师这个不报错。”
细看,定义数组时:
int a;cin>>a;int A[a];
这不科学,定义数组时,元素个数用变量,没有这么玩的!
有人跟上了:“我一直这么用!”
这还了得,十几年的修行,就这么塌了。C和C++一直在规定数组定义时,元素个数必须能确定。作为人工语言,就这么规定的,也在各种编译器中得到了贯彻。
学生猜测:“CodeBlocks 13.12的新支持?”
我只能先澄清:“不是13.12的事。codeblocks给了个壳,编译的活是gcc干的。难道是某版本gcc放松要求了?苦逼的计算机老师,就这么被坑了。谁查查资料,考证一下。搞清楚前,即使允许,也按规矩来。”
晚上睡不着,自己查一查。居然找出去年我发的博文《初探C++数组的size可以是变量》,当时在WalterSavitch的《C++程序设计(第8版)》中查到“数组长度使用变量,对大多数编译器是非法的。”在举例中提到“有的编译(但并非全部)允许用变量指定数组长度。但是为了移植性,不应该这样做,即使目前所用的编译器允许。”
这算是一个解释。
记吃不记打。去年的学生提到过的问题,我做过初探,居然也忘记了。
菜鸟的优秀品质就在于由于不知而无畏,可以撞到各种错。这实际上,是原生学习力中的重要部分。一个有程序设计功底的人,看了书上讲的,会很快理解,并自觉不去这样做。这样的问题,不会由有经验者发现。
为和菜鸟们厮混而自豪。
今年想将工作推进一步。查了ISO/IEC14882(C++语言的国际标准)在1998年和2011年出的两个版本,在8.3.4小节都强调了定义数组时,要用常量!
写了下面的程序,在CodeBlocks13.12下调试,编译器是GCC 4.7.1。
#include<iostream>using namespace std;int main( ){ int n; cin>>n; int a[n]; for(int i=0; i<n+2; i++) a[i]=i; for(int i=0; i<n+5; i++) cout<<a[i]<<" "; return 0;}
居然连个警告都没有!
还让不让人教C++了。学院在改培养方案,明年不会给大一的教C++了,教C。
再查,说这种宽松是由C99而来的。找到ISO/IEC 9899:TC2(C语言标准)6.7.5.2小节中,果然有这样的规定。
决定不再考证。如何在CodeBlocks中让这样的程序不能通过呢?
改设置。
找CodeBlocks13.12的菜单setting->Compiler...,
打勾的设置要求用严格的ISO标准提出警告。
再编译程序,终于来了警告:
D:\CPP\codeBlock\example\main.cpp|7|warning: ISO C++ forbids variable length array 'a' [-Wvla]|
再想让报出错来,没有找到设置。换一种编译器,一定能得逞。不折腾了。
想知道,在企业中是如何处理这件事情的。找到了《Google C++ 编程规范.pdf》,下面是截图:
我不知道所谓变长数组的确切定义,但是启示却很明白,老老实实地按常规写程序。在这方面,不必紧跟放松了的规定。
- 再探C++数组的size可以是变量
- 初探C++数组的size可以是变量
- C语言数组长度可以是一个变量吗?
- C语言的数组可以用变量定义吗?
- C/C++ 数组下标可以是负值
- c/c++ 数组是下标为什么可以是负值
- 在C ++中,可以用于变量和函数上的关键字是哪一个?
- 排序一个数组可以是有用的
- lua 数组的索引可以是负数
- 哈哈,新发现!C语言中是可以有动态数组的!!
- C语言指针变量可以当做数组运用
- 你不知道的c语言之为什么数组的大小不能是变量
- SSD盘的sector size是可以用SSD厂商提供的工具来修改的
- 一个数组中的值可以是另一个数组,另一个数组的值也可以是一个数组吗?
- 原来D2007是可以支持类变量的,嘿嘿
- 【JavaScript】变量冲突是可以通过编译的
- 指针可以指向数组size 的下一个, 即just beyond it by one element(non-existent)
- NanguoCoffee 知道为啥HashMap里面的数组size必须是2的次幂?
- 算法学习 - Gray Code(格雷码)的解释和c++实现
- BLAS loading error:
- nodejs学习心得
- 【leetcode】Palindrome Number
- BLAS loading error:
- 再探C++数组的size可以是变量
- dec 9
- poj 3259 最短路
- Ceilometer项目源码分析----ceilometer-collector服务的初始化和启动
- pyqt中的快捷键设置(CTRL-C/CTRL-V)
- 网站推广优化教程集锦
- 凌晨杂语
- [学习笔记]Java包机制
- 修改flex4 List的多选模式