有时在程序中设置变量值比输入变量值更合适。但是,为数组的各个元素编写单独的赋值语句可能意味着大量的输入,对于大型数组而言尤其如此。

例如,来看一个程序:

#include

#include

using namespace std;

int main()

{

const int NUM_MONTHS = 12;

int days[NUM_MONTHS];

days[0] = 31; // January

days[1] = 28; // February

days[2] = 31; // March

days[3] = 30; // April

days[4] = 31; // May

days[5] = 30; // June

days[6] = 31; // July

days[7] = 31; // August

days[8] = 30; // September

days[9] = 31; // October

days[10] = 30; // November

days[11] = 31; // December

for (int month = 0; month < NUM_MONTHS; month++)

{

cout << "Month "<< setw (2) << (month+1) << " has ";

cout << days[month] << " days.\n";

}

return 0;

}

程序输出结果:

Month  1 has 31 days.

Month  2 has 28 days.

Month  3 has 31 days.

Month  4 has 30 days.

Month  5 has 31 days.

Month  6 has 30 days.

Month  7 has 31 days.

Month  8 has 31 days.

Month  9 has 30 days.

Month 10 has 31 days.

Month 11 has 30 days.

Month 12 has 31 days.

幸运的是,还有一个选择,C++ 允许在定义数组时初始化数组。通过使用初始化列表,可以在创建数组时轻松初始化数组的所有元素。以下语句定义 days 数组,并使用之前程序中赋值语句集所建立的相同值对其进行初始化:

int days [NUM_MONTHS] = {31,28,31,30,31,30,31,31,30,31,30, 31};

这些值按照它们出现在列表中的顺序存储在数组元素中(第一个值 31 存储在 days[0]  中,第二个值 28 存储在 days [1] 中,等等)。图 1 显示了初始化后数组的内容。

图 1 通过初始化列表赋值后的数组内容

下面程序是上边程序的修改版。它在创建 days 数组时即对其进行了初始化,而不是使用单独的赋值语句。请注意,初始化列表分散在多行中。该程序还添加了一个 string 对象数组来保存月份名称:

#include

#include

#include

using namespace std;

int main()

{

const int NUM_MONTHS = 12;

string name[NUM_MONTHS]={ "January", "February", "March", "April", "May" , "June", "July", "August", "September", "october", "November", "December"};

int days[NUM_MONTHS] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

for (int month = 0; month < NUM_MONTHS; month++)

{

cout << setw(9) << left << name[month] << " has ";

cout << days [month] << " days. \n";

}

return 0;

}

程序输出结果:

January   has 31 days.

February  has 28 days.

March     has 31 days.

April     has 30 days.

May       has 31 days.

June      has 30 days.

July      has 31 days.

August    has 31 days.

September has 30 days.

october   has 31 days.

November  has 30 days.

December  has 31 days.

到目前为止,已经演示了如何使用数值填充数组,然后显示所有的值。但是,有时候可能还需要更多功能,例如从数组中检索一个特定的值。下面程序是上面程序的变化版本,它可以显示用户选择的月份中有多少天。

#include

#include

#include

using namespace std;

int main()

{

const int NUM_MONTHS = 12;

int choice;

string name[NUM_MONTHS]={ "January", "February", "March", "April", "May" , "June", "July", "August", "September", "october", "November", "December"};

int days[NUM_MONTHS] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

cout << "This program will tell you how many days are "<< "in any month.\n\n";

// Display the months

for (int month = 1; month <= NUM_MONTHS; month++)

cout << setw (2) << month << " " << name [month-1] << endl;

cout << "\nEnter the number of the month you want: ";

cin >> choice;

// Use the choice the user entered to get the name of

// the month and its number of days from the arrays.

cout << "The month of " << name [choice-1] << " has " << days[choice-1] << " days.\n";

return 0;

}

程序输出结果为:

This program will tell you how many days are in any month.

1 January

2 February

3 March

4 April

5 May

6 June

7 July

8 August

9 September

10 october

11 November

12 December

Enter the number of the month you want: 4

The month of April has 30 days.

从数组元素1开始

真实世界中存在着大量的逻辑上以 1 开头的事物,在给这样的事物建立模型时,很多教师会偏向于让学生不要使用元素 0,而改为从元素 1 开始存储实际数据。一年中的月份数就是一个很好的例子。在这种情况下,可以声明 name 和 days 数组每个都有 13 个元素,并按以下方式对它们进行初始化:

string name[NUM_MONTHS+1]={" ", "January", "February", "March", "April", "May" , "June", "July", "August", "September", "october", "November", "December"};

int days[NUM_MONTHS+1] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

注意数组元素 0 没有被使用。它只是一个虚拟的值。这样可以将一月份的名称存储在 name[1] 中,二月份的名称将存储在 name[2] 中,以此类推。同样,1 月份的天数将保存在 days[1] 元素中,2 月份的天数将保存在 days[2] 元素中,以此类推。

如果使用上述方法定义和初始化数组,则循环应该改写为以下形式。它将显示数组元素 1〜12 的内容,而不是像以前那样显示元素 0〜11。

for (int month = 1; month <= NUM_MONTHS; month++)

{

cout << setw(9) << left << name[month] << " has ";

cout << days[month] << " days.\n";

}

如果实际数据以元素 1 开始存储,那么也不需要将数组下标加 1 来定位特定的数据。以下是列出每个月编号和名称的语句修改:

for (int month = 1; month <= NUM_MONTHS; month++)

cout << setw (2) << month << " " << name [month] << endl;

显示用户所选月份的天数的代码应修改为如下所示。

cout << "The month of " << name[choice] << " has "<< days [choice] << " days . \n";

数组部分初始化

当一个数组被初始化时,C++ 并不是必须获得每个元素的值,也可以只初始化数组的一部分,如下所示:

int numbers[7] = {1, 2, 4, 8};

这个定义只初始化了一个7元素数组中的前 4 个元素,如图 2 所示。

图 2 数组允许部分初始化

值得一提的是,图 2 中未被初始化的元素将全部被设置为零。这是数字数组部分初始化时发生的情况。当一个 string 对象数组被部分初始化时,未初始化的元素将全部包含空字符串,即长度为 0 的字符串。即使部分初始化的数组在局部定义,也会如此。但是,如果本地数组完全未初始化,则其元素将包含“垃圾”,就像其他局部变量一样。

下面的程序显示了在部分初始化之后的 numbers 数组的内容:

#include

using namespace std;

int main ()

{

const int SIZE = 7;

int numbers[SIZE] = {1, 2, 4, 8}; // Initialize the first 4 elements

cout << "Here are the contents of the array: \n";

for (int index = 0; index < SIZE; index++)

cout << numbers [index] << " ";

cout << endl;

return 0;

}

程序输出结果:

Here are the contents of the array:

1 2 4 8 0 0 0

虽然数组初始化列表的值可以比数组的元素少,但不允许有比数组元素更多的值。以下语句是非法的,因为 numbers 数组只能包含 7 个值,但初始化列表中却包含 8 个值。

int numbers [7] = {1, 2, 4, 8, 3, 5, 7, 9};    //不合法

另外,如果留下了某个元素未初始化,那么该元素之后的所有元素都应该保留为未初始化。C++ 不提供跳过初始化列表中元素的方法。以下是另一个非法的例子:

int numbers [7] = {1, , 4, , 3, 5, 7};    // 不合法

隐式数组大小

可以通过提供一个包含每个元素值的初始化列表来定义一个数组而不指定它的大小。C++ 会计算初始化列表中的项目数,并为数组提供相应数量的元素。例如,以下定义创建 了一个包含5个元素的数组:

double ratings [] = {1.0,1.5,2.0,2.5,3.0};

注意,如果省略大小声明符,则必须指定一个初始化列表。否则,C++ 不知道该数组有多大。

初始化变量的新方法

到目前为止,已经介绍过的定义和初始化常规变量的方法是使用赋值语句,示例如下:

int value = 5;

但是,我们已经学习过使用函数、数组以及类,所以现在是时候来介绍另外两种在定义变量的同时即进行初始化的方法。

第一种新方法是使用函数符号初始化变量。它看起来就像是给一个函数传递参数。如果您已经掌握了类的内容,那么就会注意到,它也很像是在创建类对象时给一个构造函数传递值。以下是使用函数符号定义变量 value 并初始化其值为 5 的示例语句:

int value (5);

第二种初始化变量的新方法是 C++ 11 中新引入的,使用大括号表示法。它看起来就像是刚刚上面所看到的初始化数组的方法,但是其中有两点区别:

因为常规变量只能一次保存一个值,所以通过这种方法初始化变量时,大括号中只有一个值;

和数组初始化列表不一样,通过这种方法初始化变量时,在大括号前面没有赋值运算符(=)。

以下是使用大括号表示法定义变量 value 并初始化其值为5的示例语句。

int value{5}; //该语句仅在C++ 11或更高版本中合法

绝大多数程序员会继续使用赋值运算符来初始化常规变量,本书也将如此,但是,大括号表示法提供了一项优点,它会检查用来初始化变量的值,并确保匹配变量的数据类型。例如,假设 doubleVal 是一个 double 类型变量,存储在其中的值为 6.2。则使用赋值运算符时,可以编写以下两种形式的语句之一:

int valuel = 4.9; //该语句将给valuel赋值为。4

int vaule2 = doubleVal; // 该语句将给 value2 赋值为 6

在这两种情况下,值的小数点部分都会被先截断,然后才赋值给被定义的变量。这虽然可能会导致一些问题,但 C++ 编译器是允许的,它也会提出警告,但却仍然能生成可执行文件,并且可以运行。不过,如果在这里使用的是大括号表示法,则编译器会指出这些语句产生了一个错误,并且不会生成可执行文件。必须先修复该错误,然后重新编译项目才能运行该程序。

linux c 数组初始化,C++数组初始化方法详解相关推荐

  1. php 去重_php求两数组交集的四种方法详解

    题目:给定两个数组,编写一个函数来计算它们的交集. 示例 1: 输入: nums1 = [1,2,2,1],nums2 = [2,2] 输出: [2] 示例 2: 输入: nums1 = [4,9,5 ...

  2. TIA博途中数组Array的基本使用方法详解

    TIA博途中数组Array的基本使用方法详解 ARRAY类型是由数目固定且数据类型相同的元素组成的数据结构. ARRAY类型的定义和使用需要注意以下几点: • ARRAY类型可以在DB.OB/FC/F ...

  3. java 两个数组去重复数据_Java实现数组去除重复数据的方法详解

    本文实例讲述了Java实现数组去除重复数据的方法.分享给大家供大家参考,具体如下: 前一段时间被面试问到:如果一个数组中有重复元素,用什么方法可以去重?一时间会想到用一种方法,但是后来查阅资料后发现, ...

  4. php ajax向后台怎么传数组,利用ajax传递数组及后台接收的方法详解

    这篇文章主要给大家介绍了关于利用ajax传递数组及后台接收的相关资料,文中介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们一起来学习学习吧. 前言 我们在使用ajax异步的提交多选框得到需要 ...

  5. linux 驱动编译静态,Linux驱动静态编译和动态编译方法详解

    内核源码树的目录下都有两个文档Kconfig和Makefile.分布到各目录的Kconfig构成了一个分布式的内核配置数据库,每个Kconfig分别描述了所属目录源文档相关的内核配置菜单.在内核配置m ...

  6. linux下防DDOS***软件及使用方法详解

    互联网如同现实社会一样充满钩心斗角,网站被DDOS也成为站长最头疼的事.在没有硬防的情况下,寻找软件代替是最直接的方法,比如用 iptables,但是iptables不能在自动屏蔽,只能手动屏蔽. 一 ...

  7. linux如何批量处理图片名,Linux下批量修改图片名称的方法详解

    我们都知道,要修改文件夹下的图片名称很容易,那么有什么方法能够快速批量修改图片名称呢?这篇文章主要为大家介绍了linux系统中如何批量修改图片文件名的案例演示,如果想修改linux文件夹下的图片名称, ...

  8. linux系统下添加新硬盘的方法详解

    对于linux新手来说,在linux上添加新硬盘,是很有挑战性的一项工作. 在Linux服务器上把硬盘接好,启动linux,以root登陆. fdisk -l ## 这里是查看目前系统上有几块硬盘 D ...

  9. c语言 初始化数组,C 数组的初始化方法详解

    C 数组的初始化方法详解,数据名内涵为数组这种数据结构,在arrayTest函数体内,str是数组名,那为什么sizeof的结果却是指针的长度?这是因为: (1)数组名作为函数形参时,在函数体内,其失 ...

  10. linux jq 遍历数组,jquery 遍历数组 each 方法详解

    JQuery拿取对象的方式 $('#id') :通过元素的id $('tagName') : 通过元素的标签名 $('tagName tagName') : 通过元素的标签名,eg: $('ul li ...

最新文章

  1. 人物丨深度学习大神Hinton推翻自己30年的学术成果另造新世界
  2. EF-CodeFirst-域模型配置
  3. python编程入门书-读书笔记之《编程小白的第1本Python入门书》
  4. 系统测试分类和测试常用方法
  5. 明源云创CI/CD技术演进
  6. 超过4g的文件怎么上传到linux,怎么免费上传大于4G的文件到百度云 大于4G的文件不开会员怎么上传到百度云...
  7. OPPO Find X5/Pro搭载一体化流线设计,采用双芯片战略
  8. javascript调用服务端验证控件
  9. 测试里程突破 1000 万英里,但 Waymo 的商业模式真的万无一失?
  10. 【体系结构】Oracle如何保证提交的数据不丢失
  11. 20145235 《Java程序设计》第8周学习总结
  12. 那些好玩的生成器网站(三)
  13. oracle dbf文件读取,读取oracle数据表,导出到DBF文件。
  14. 有关《家》的经典歌曲_著名音乐人-二十首最棒的励志歌曲推荐
  15. 简单实用的电脑桌面待办清单应用
  16. 【经典】非你莫属名句一
  17. 使用ajax实现页面分页
  18. 打分五角星html制作,css简单实现五角星评分、点赞收藏、展示评分(半颗星、1/3颗星)...
  19. redis-cli redisTemplate执行Lua脚本,解决redisTemplate.opsForSet().members获取数据问题
  20. 2017-2018-1 20162316刘诚昊 实验一 线性结构

热门文章

  1. Siemens Simatic WinCC Runtime Professional V17
  2. python樱花武汉_武汉加油!武大本科生用Python敲出樱花绽放,满屏春天太浪漫
  3. 如何建立医院患者满意度测评指标体系
  4. 开源矿工的备用矿池设计与实现
  5. 个人所得税的缴费是怎么规定的
  6. matlab 信号噪声星座图,QPSK误码率和星座图MATLAB仿真
  7. 怎么把caj文件转换成pdf文件
  8. 【.NET6+Avalonia】开发支持跨平台的仿WPF应用程序以及基于ubuntu系统的演示
  9. SCI一区顶刊Trans常客-天宇师兄的科研方法及如何更容易被录取经验分享
  10. 华为计算机单机pc游戏软件,华为应用市场