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

  在教材中,关于数组的声明,格式要求是“类型标识符 数组名[常量表达式]”,是的数组的大小,数组的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对象,这种影响可移植性的代码,还是少写。

  如果以后有闲,倒是可以考察下当初标准为何要做出这样的调整。调整,意味着有些道理,有机会知道下,还是件不错的事。

 

 

 

时间: 2025-01-01 02:53:02

初探C++数组的size可以是变量的相关文章

判断数组中是否包含指定变量或元素

本文章提供了二款判断数组中是否包含指定变量或元素哦,主要是判断数组中是否包括指定字符或变量哦.这个是javascript教程的哦. 方法一 Array.prototype.contains = function (element) { for (var i = 0; i < this.length; i++) { if (this[i] == element) { return true; } } return false; } 方法二 Array.prototype.contains = fu

PHP extract 将数组拆分成多个变量的函数_php技巧

extract()函数语法: int extract( array $var_array [, int $extract_type = EXTR_OVERWRITE [, string $prefix ]] ) 功能: extract()函数提取关联数组(对数字索引数组无效)每对key和value,生成以key为变量名.value为对应值的多组新变量. 复制代码 代码如下: <?php $size = "old size"; //注意最后size变量的值. $a = array(

使用Python将数组的元素导出到变量中(unpacking)_python

解决的问题 需要将数组(list)或元组(tuple)中的元素导出到N个变量中. 解决的方案 任何序列都可以通过简单的变量赋值方式将其元素分配到对应的变量中,唯一的要求就是变量的数量和结构需要和序列中的结构完全一致. p = (1, 2) x, y = p # x = 1 # y = 2 data = ['google', 100.1, (2016, 5, 31)] name, price, date = data # name = 'google' # price = 100.1 # date

c 数组-好奇怪,声明变量必须在数组声明之前???

问题描述 好奇怪,声明变量必须在数组声明之前??? 看个小代码,前后只是改变了i,j声明的位置,可第二个报错 /*用循环语句构造方阵*/ #include<stdio.h> #include<stdlib.h> int main(void) { int i,j; static int a[5][5]; /*用static,可为其赋初值0*/ a[0][0] = 5; /*为a[0][0]赋初值,以此为基础通过运算得出其它结果*/ for (i = 0; i < 5; i++)

mfc-为什么类中的数组size会突然变大

问题描述 为什么类中的数组size会突然变大 vector ans; //类中的public成员变量 先在一个函数中为ans push_back了很多值 这里的size是正常的因为 for (int i = 0; i < ans.size(); i++) m_list.AddString(ans[i]->getNum()); 可以正常执行,在listbox上可以看到正确的运行结果 但是在另一个按钮响应函数中执行下列语句时则一直提示 遇到不适当的参数 void searchInfo::OnLbn

C++用指针变量作为函数的参数接受数组的值的问题详细总结_C 语言

实参和形参的四种结合方式 实参 形参 实例数组名 数组名 1.1数组名 指针变量 1.2指针变量 数组名 1.3指针变量 指针变量 1.4本文以输入10个整数,然后对其进行排序,然后输出的程序为例: 形参为数组名,实参是数组名 实例代码1.1: 复制代码 代码如下: #include<iostream>using namespace std;int main(){ void Sort(int a[],int n); int a[10],i; cout<<"Please i

js中与变量相关的一些知识

来补充一点上一篇文章 js变量初探 中漏掉的知识点: 1.变量的定义与声明中常见问题: (1)用var关键字声明的变量,未经初始化时,保存的是一个特殊的值-undefined,变量初始化仅仅是给变量赋一个值 (2)当使用var关键字声明了一个变量时,创建的这个变量是不可配置的,也就是说这个变量无法通过delete运算符删除:在严格模式下,使用delete运算符删除var关键字声明的变量会导致SyntaxError. (3)省略var关键字会导致定义一个全局变量,但是不推荐这种做法.在严格模式下,

c/c++ 函数、常量、指针和数组的关系梳理

压力才有动力,15年中旬就要准备实习,学习复习学习复习学习复习学习复习--无限循环中,好记性不如烂笔头--从数组开始,为主干. c 的array由一系列的类型相同的元素构成,数组声明包括数组元素个数和类型,c 中的数组参数是引用形式传参(传址调用),而常量标量是按值传递. //[]方括号表示声明的是数组,里面的数字表明了数组包含的元素数目 int states[50];//声明50个整数的数组 double code[365];//声明365个浮点数的数组 char chr[20];//声明20

第4章 数据处理-php数组的处理-郑阿奇

1.数组的处理: 1.1 数组的创建和初始化: 1.arrary()函数创建数组,默认情况下0元素是数组的第一个元素, count()和sizeof()函数获得数据元素的个数 2.使用变量建立数组 compact()在当前的符号表中查找该变量名并将它添加到输出的数组中,变量名成为键名而变量的内容成为该键的值. 复制代码 代码如下: <?php $num=10; $str="string"; $array=array(1,2,3); $newarray=compact("