再探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》,下面是截图:


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





目录
相关文章
|
24天前
|
存储 C++
C++语言中指针变量int和取值操作ptr详细说明。
总结起来,在 C++ 中正确理解和运用 int 类型地址及其相关取值、设定等操纵至关重要且基础性强:定义 int 类型 pointer 需加星号;初始化 pointer 需配合 & 取址;读写 pointer 执向之处需配合 * 解引用操纵进行。
137 12
|
12月前
|
搜索推荐 编译器 C语言
【C++核心】特殊的元素集合-数组与字符串详解
这篇文章详细讲解了C++中数组和字符串的基本概念、操作和应用,包括一维数组、二维数组的定义和使用,以及C风格字符串和C++字符串类的对比。
203 4
|
8月前
|
存储 算法 搜索推荐
【C++面向对象——群体类和群体数据的组织】实现含排序功能的数组类(头歌实践教学平台习题)【合集】
1. **相关排序和查找算法的原理**:介绍直接插入排序、直接选择排序、冒泡排序和顺序查找的基本原理及其实现代码。 2. **C++ 类与成员函数的定义**:讲解如何定义`Array`类,包括类的声明和实现,以及成员函数的定义与调用。 3. **数组作为类的成员变量的处理**:探讨内存管理和正确访问数组元素的方法,确保在类中正确使用动态分配的数组。 4. **函数参数传递与返回值处理**:解释排序和查找函数的参数传递方式及返回值处理,确保函数功能正确实现。 通过掌握这些知识,可以顺利地将排序和查找算法封装到`Array`类中,并进行测试验证。编程要求是在右侧编辑器补充代码以实现三种排序算法
125 5
C++(十一)对象数组
本文介绍了C++中对象数组的使用方法及其注意事项。通过示例展示了如何定义和初始化对象数组,并解释了栈对象数组与堆对象数组在初始化时的区别。重点强调了构造器设计时应考虑无参构造器的重要性,以及在需要进一步初始化的情况下采用二段式初始化策略的应用场景。
|
11月前
|
C语言 C++
实现两个变量值的互换[C语言和C++的区别]
实现两个变量值的互换[C语言和C++的区别]
128 0
|
算法 C++
c++学习笔记04 数组
这篇文章是C++学习笔记4,主题是数组。
93 4
|
存储 安全 C++
C++:指针引用普通变量适用场景
指针和引用都是C++提供的强大工具,它们在不同的场景下发挥着不可或缺的作用。了解两者的特点及适用场景,可以帮助开发者编写出更加高效、可读性更强的代码。在实际开发中,合理选择使用指针或引用是提高编程技巧的关键。
128 1
|
C++ 索引 运维
开发与运维数组问题之在C++中数组名和指针是等价如何解决
开发与运维数组问题之在C++中数组名和指针是等价如何解决
80 6
|
存储 安全 C++
开发与运维数组问题之声明一个数组如何解决
开发与运维数组问题之声明一个数组如何解决
82 6
|
存储 C++ 容器
开发与运维数组问题之C++标准库中提供数据容器作为数组的替代如何解决
开发与运维数组问题之C++标准库中提供数据容器作为数组的替代如何解决
134 5