再探C++数组的size可以是变量

简介: 学生在QQ群中贴图:他说:“老师这个不报错。”细看,定义数组时:int a;cin>>a;int A[a];这不科学,定义数组时,元素个数用变量,没有这么玩的!有人跟上了:“我一直这么用!”这还了得,十几年的修行,就这么塌了。C和C++一直在规定数组定义时,元素个数必须能确定。作为人工语言,就这么规定的,也在各种编译器中得到了贯彻。学生猜测:“CodeBlock

学生在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》,下面是截图:


我不知道所谓变长数组的确切定义,但是启示却很明白,老老实实地按常规写程序。在这方面,不必紧跟放松了的规定。





目录
相关文章
|
1月前
|
存储 IDE 编译器
深入探索C++中的变量世界:理论与实践
【4月更文挑战第5天】本文介绍了C++变量的基础知识,包括声明、数据类型、const和volatile限定符。通过示例展示了变量在用户输入、计算、控制流程和函数参数中的应用,并列举了常见错误及避免方法,如未声明、作用域混淆、类型不匹配、未初始化和拼写错误。最后提出了变量命名、避免冗余、适时复用、注释说明和利用现代C++特性的最佳实践。
28 0
|
2月前
|
存储 安全 C++
C++ 用户输入与数据类型详解:建立基本计算器及变量类型
了解C++的用户输入和数据类型。使用`cin`从键盘读取数据,如在简单计算器示例中获取两个数字并求和。C++的数据类型包括:`int`(整数)、`float`(浮点数,约6-7位小数)、`double`(更精确的浮点数,约15位小数)、`bool`(布尔值,true或false)、`char`(单个字符)和`string`(文本字符串)。每种类型都有特定的存储大小和用途。在处理浮点数时,`double`通常更安全。字符串需要包含`&lt;string&gt;`库。更多内容可关注微信公众号`Let us Coding`获取。
40 0
|
5天前
|
算法 C++
【C++入门到精通】condition_variable(条件变量)C++11 [ C++入门 ]
【C++入门到精通】condition_variable(条件变量)C++11 [ C++入门 ]
9 0
|
11天前
|
编译器 C++
【C++】【C++的常变量取地址问题(对比C的不同)】const修饰的常变量&volatile修饰用法详解(代码演示)
【C++】【C++的常变量取地址问题(对比C的不同)】const修饰的常变量&volatile修饰用法详解(代码演示)
|
14天前
|
存储 C++
【C++模板】模板实现通用的数组
【C++模板】模板实现通用的数组
|
18天前
|
存储 程序员 编译器
C++从入门到精通:1.1.1基础语法之变量
C++从入门到精通:1.1.1基础语法之变量
|
19天前
|
存储 人工智能 C++
【重学C++】【指针】详解让人迷茫的指针数组和数组指针
【重学C++】【指针】详解让人迷茫的指针数组和数组指针
34 1
|
1月前
|
C++ 索引
C++ 获取数组大小、多维数组操作详解
本文介绍了如何获取数组的大小和使用`sizeof()`运算符。`sizeof()`返回数组所占字节数,而非元素个数。要获取元素个数,需除以单个元素的大小。此外,文章展示了如何使用`sizeof()`遍历数组,包括多维数组。多维数组是数组的数组,可用来表示网格。文中以战舰游戏为例说明了多维数组的应用。最后提到了微信公众号`Let us Coding`以获取更多内容。
22 0
|
1月前
|
存储 C++ 索引
C++数组
C++数组
|
1月前
|
存储 程序员 编译器
C++注释、变量、常量、关键字、标识符、输入输出
C++注释、变量、常量、关键字、标识符、输入输出