文档章节

第四章 复合类型之结构、共用体和枚举

竖子小子傻子
 竖子小子傻子
发布于 2015/05/03 17:25
字数 1750
阅读 16
收藏 0

        今天比昨天晚一点,因为马刺VS快船的比赛太精彩也太感人了,我支持的马刺遗憾出局,但虽败犹荣。只怨保罗太逆天!

        今天要看的是结构、共用体和枚举,其实都很简单,但是也有很多细节需要认真阅读。还是框架图!

结构

1.定义结构布局和创建结构变量以及初始化

        我们使用关键字struct定义一个结构的布局,可以像下面一样定义一个结构的布局:

struct inflatable
{
    char name[20];
    float volume;
    double price;
};

标识符 inflatable是这种数据格式新的名称,可以使用它来创建这种数据格式的变量,如下所示:

inflatable hat;    //hat is a structure variable of type inflatable
inflatable woopie_cushion;    //type inflatable variable
inflatable mainframe;    //type inflatable variable

以上语句声明了3个 inflatable类型的结构变量,都具有 name、volume、price 3个成员变量。值得注意的是, 在声明结构变量时,C语言需要使用关键字struct,但是C++可以省略。

        结构变量的初始化和数组差不多,如下:

inflatable guest=
{
    "Glorious Gloria",    //name value
    1.88,                //volume value
    29.99                //price value
};
inflatable duck{"Daphne",0.12,9.98};  //can omit the = in C++11
inflatable mayor{};  //volume和price被设置为0,且name的每个字节都被设置为0

         可以将定义结构布局与创建结构变量结合起来,像这样:

struce perks
{
    int key_number;
    char car[12];
}mr_smith,ms_jones;    //two perks variables

        如果你觉得还不够方便,我们还 可以把初始化也加进来,像这样:

struct perks
{
    int key_number;
    char car[12];
}mr_glitz=
{
    7,
    "Packard"
};

        不过看起来不太好看, 最好还是把3者都分开,让程序更容易阅读和理解。我们还可以省略结构名直接定义结构变量,像这样:

struct         //no tag
{
    int x;
    int y;
}position;     //a structrue variable

2.使用结构

        说了这么多,我们该使用结构了,来个程序:

程序清单4.11        strucur.cpp
#include <iostream>
struct inflatable
{
	char name[20];
	float volume;
	double price;
} ;
int main()
 {
	using namespace std;
	
	inflatable guest=
	{
    	"Glorious Gloria",    //name value
    	1.88,                //volume value
    	29.99                //price value
	};	
	inflatable pal=
	{
		"Audacious Arthur",
		3.12,
		32.99
	};
	cout<<"Expand your guest list with "<<guest.name;
	cout<<" and "<<pal.name<<"!\n";
	cout<<"You can have both for $";
	cout<<guest.price+pal.price<<"!\n";
	
	return 0;
}

        主要说明访问结构的成员变量要使用点运算符(.)。下面是运行结果:

        再来一个案例:

程序清单4.12        assgn_st.cpp
#include <iostream>
struct inflatable
{
	char name[20];
	float volume;
	double price;
} ;
int main()
 {
	using namespace std;
	
	inflatable bouquet=
	{
		"sunflower",
		0.20,
		12.49
	};
	inflatable choice;
	cout<<"bouquet: "<<bouquet.name<<" for $";
	cout<<bouquet.price<<endl;
	
	choice=bouquet;		//assign one structrue to another
	cout<<"choice: "<<choice.name<<" for $";
	cout<<choice.price<<endl;
	
	return 0;
}

        运行结果如下:

        这说明结构变量是可以直接赋值的,和数组不同。

3.结构数组

        可以这样定义一个结构数组变量:

inflatable guest[2]=    //initializing an array of structs
{
    {"Bambi",0.5,21.99},    //first structure in array
    {"Godzilla",2000,565.99}    //next structure in array
};

        看下面的程序:

#include <iostream>
struct inflatable
{
	char name[20];
	float volume;
	double price;
} ;
int main()
 {
	using namespace std;
	
	inflatable guests[2]=    //initializing an array of structs
	{
    	{"Bambi",0.5,21.99},    //first structure in array
   		{"Godzilla",2000,565.99}    //next structure in array
	};
	
	cout<<"The guests "<<guests[0].name<<" and "<<guests[1].name
		<<"\nhave a combined volume of "
		<<guests[0].volume+guests[1].volume<<" cubic feet.\n";
		
	return 0;
}

运行结果:

4.结构中的位字段

  1. 共用体

        共用体(union)是一种数据格式,能够存储不同的数据类型,但只能同时存储其中的一种。例如:

union one4all
{
    int int_val;
    long long_val;
    double double_val;
};

        句法和结构类似,只是关键字变成 union 但含义不同。

one4all pail;
pail.int_val=15;        //store an int
cout<<pail.int_val;
pail.double_val=1.38;    //store a double, int value is lost
cout<<pail.double_val;

         pail有时可以是 int变量,又可以是 double变量。 由于每次只能存储一个变量,因此它必须有足够的空间来存储最大的成员,所以,共用体的长度为其最大成员的长度。


        结构中含有匿名共用体,可以直接用结构的名称直接访问共用体的成员,如下所示:

struct widget
{
	char brand[20];
	int type;
	union 
	{
		long id_num;
		char id_char[20];
	 } ;
};
widget prize;
if(prize.type==1)
    cin>>prize.id_num;
else
    cin>>prize.id_char;
        共用体常用于节省内存,例如将C++用于嵌入式系统编程的时候。此外,共用体常用于操作系统数据结构或者硬件数据结构。

  1. 枚举

        enum 工具提供了另一种创建符号常量的方式,可以用来代替const 。使用句法也与结构相似,例如:

enum spectrum{red,orange,yellow,green,blue,violet,indigo,ultraviolet};

         这条语句完成了两项工作,一是让spectrum 成为枚举(enumeration),就像结构一样;二是将red、orange、yellow等作为符号常量,对应的值为0~7可以显式地指定整数来覆盖默认值,如:

enum bits{one=1,two=2,four=4,eitht=8};

指定的值必须是整数,也可以显式地定义其中的一些枚举量的值,如:

enum bigstep{first,second=100,third};

        在这里,first的值为0,而third的值为101,这是需要注意的。 

1.赋值

        我们可以声明一个枚举类型的变量:spectrum band; 不进行强制转换的话有:

band=blue;    //valid,blue is an enumeration
band=2000;    //invalid,2000 not an enumeration

        变量band只能有8个可能的值。如果试图将一个非法值赋给它,有些编译器会出现错误,有的会发出警告。为了获得最大限度地可移植性,应将把非enum值赋给enum变量视为错误。 

        枚举只定义了赋值运算符,没有其他的算术运算符

band=orange;        //valid
++band;         //not valid
band=orange+red        //not valid,but a little triky

        枚举量是整型,可被提升为int类型,但int类型不能自动转换为枚举类型

int color=blue;     //valid
band=3;             //invalid,int not converted to spectrum
color=3+red;        //valid

        我们再来看这个语句为什么错误:

band=orange+red;        //not valid,but a little triky

        orange+red 这个表达式将被转化成1+0,是合法的,但是被转换成了int类型,将int类型再赋给spectrum类型为非法的,可以利用强制类型转换来得到想要的结果

band=spectrum(orange+red);        
band=spectrum(3);

        上面两条语句都是可以的,但如果是这样呢?

band=spectrum(4003);

        将4003转换以后在spectrum里面找不到定义,即超出了定义范围。但是编译器不会报错也不会警告。

2.取值范围

        取值范围的定义如下:

        首先,要找出上限,即枚举量的最大值,找到最大值的最小的2次幂,然后将2次幂的值减1,得到的值便是上限。如bigstep的最大值为101,比这个数大的最小2次幂为128,因此取值上限为127.计算下限值则需要知道枚举量的最小值,如果不小于0则下限为0;否则采用相同的方式寻找,不过最后的结果要加上符号。 如最小值为-6,计算比6大的最小二次幂为8,所以最后的下限为-7。





© 著作权归作者所有

竖子小子傻子
粉丝 0
博文 8
码字总数 10039
作品 0
广州
私信 提问
C语言-第八章、构造数据类型

8_1 结构体的概念和结构体变量 _1.1 结构体的概念 C语言中允许用户自己构造由不同数据类型的数据所组成的集合体,称为结构体。结构体属于数据类型,每一个结构体有一个名字,称为结构体名。一...

南风末
2016/11/05
30
0
C语言数据类型和变量的实质

c语言分为: 基本数据类型 整数 整形 -- int 占四个字节 短整型 -- short int 占两个字节 长整形 -- long int 占八个字节 浮点数【实数】 单精度浮点数 -- float 占四个字节 双精度浮点数 --...

天道酬勤VIP
2017/11/28
0
0
【C++】第4章 复合类型 知识总结

《C++ Primer Plus》第4章知识点总结 内置的C++类型分两组:基本类型和复合类型。本文将介绍复合类型 数组 声明数组的通用格式:typeName arrayName[arraySize]; 数组的初始化 (1)只有在定...

qq_37792173
2017/09/20
0
0
【结构体】关于结构体,枚举,联合,位段的一些知识

** 1.结构体类型创建 结构体市一些值的集合,这些值成为成员变量。 结构体的每个成员可以是不同类型的变量 结构体的成员可以是标量,数组,指针甚至是其他的结构体 不同的结构体之间不允许赋...

qregi
2017/12/13
0
0
小议大小端模式对C语言的共用体结构的影响

小议大小端模式对C语言的共用体结构的影响 1、一些问题 问题1 答案是B A;为什么不是A B呢? 在前面的文章中我们已经测试过,X86体系结构的CPU是小端模式的。比如一个数0x1234,放在内存里按照...

长平狐
2013/06/03
58
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 早上儿子问我他是怎么来的

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @凉小生 :#今日歌曲推荐# 少点戾气,愿你和这个世界温柔以待。中岛美嘉的单曲《僕が死のうと思ったのは (曾经我也想过一了百了)》 《僕が死の...

小小编辑
今天
2.2K
14
Excption与Error包结构,OOM 你遇到过哪些情况,SOF 你遇到过哪些情况

Throwable 是 Java 中所有错误与异常的超类,Throwable 包含两个子类,Error 与 Exception 。用于指示发生了异常情况。 Java 抛出的 Throwable 可以分成三种类型。 被检查异常(checked Exc...

Garphy
今天
38
0
计算机实现原理专题--二进制减法器(二)

在计算机实现原理专题--二进制减法器(一)中说明了基本原理,现准备说明如何来实现。 首先第一步255-b运算相当于对b进行按位取反,因此可将8个非门组成如下图的形式: 由于每次做减法时,我...

FAT_mt
昨天
40
0
好程序员大数据学习路线分享函数+map映射+元祖

好程序员大数据学习路线分享函数+map映射+元祖,大数据各个平台上的语言实现 hadoop 由java实现,2003年至今,三大块:数据处理,数据存储,数据计算 存储: hbase --> 数据成表 处理: hive --> 数...

好程序员官方
昨天
61
0
tabel 中含有复选框的列 数据理解

1、el-ui中实现某一列为复选框 实现多选非常简单: 手动添加一个el-table-column,设type属性为selction即可; 2、@selection-change事件:选项发生勾选状态变化时触发该事件 <el-table @sel...

everthing
昨天
21
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部