目录
1、关于共用体
2、关于枚举
3、【问题描述】根据输入年月日确定当前星期离周末还有几天。
共用体(union)的句法与结构体类似,不同的是共用体只能同时存储一种类型的数据。以如下声明为例:
union uuu{ //声明一个名为uuu的共用体类型
int i;
long l;
double d;
}u1; //同时定义了该类型共用体变量u1
由于共用体一次只能存储一个值,所以其长度应当等于其最大成员长度。如对于u1,长度应与double相同,为8字节。
根据其成员名为标志,在不同时刻就可以处理不同类型的数据。
如使用赋值语句
u1.i=15;
由成员名i可知,此时在共用体中存储了一个int类型数据,
u1可视为一个int变量,值为15。
若再次使用赋值语句:
u1.d=6.66;
则先前存储的int值丢失,变为将一个double数据存储在u1中。
由共用体的这种特性,我们知道可以使用这种数据结构来节省内存,各类型数据可以只占据一段内存空间。只需利用共用体对象成员名就能处理不同类型数据,而不需要再分别定义各种类型变量并分别占据一段空间。
对共用体的初始化,默认赋给第一个成员,同时也可以自己指定:
uuu u2={10}; //初始化作为第一个成员的i
uuu u3={.l=100}; //初始化l
要注意的是,使用共用体时需表明成员,而不是直接使用u1。
这样写是不合法的。
11行给成员i初始化,那么下面的使用必须写为u1.i。
枚举是数组、结构体、共用体外的另一种构造类型。这种工具常用于创建符号常量。(枚举量为整型,可自动转换为int)
enum xxx{a,b,c,d}; //声明一个枚举的类型,xxx
大括号中的a,b,c,d称为枚举量,为符号常量,对应整数0-3。若后续不用创建变量,可省略xxx。
故枚举变量的值便被限制在了a,b,c,d四个enum值之中。基本类型中的算术运算符对于枚举变量是非法的。即使是这种:
xxx x1; //定义变量x1
x1=a+b; //非法
上面提过枚举量可转化为整型,而整形数据却不能自动转化为枚举量。 对枚举变量,只能用枚举量对其赋值,而不能直接使用整数。如可以将b赋给x1,确不能把1直接赋给它。(但是,我们还是可以利用强制类型转换)
枚举量的初始化中,第一个元素默认为0,后续未初始化者将比前一个量大1。若已对部分元素初始化,则从已有初始化者开始往后,使未初始化者比前一个量大1。
特别的,强制类型转换减弱了对枚举变量值的限制,简单看一眼书上讲的吧。
(摘自c++primerP)
下面是一个实际使用的案例。
也就是根据日期判断星期几。
这里没再算是否闰年,偷懒于是直接使用了基姆拉尔森计算公式。(ymd分别为年月日)
W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7
相应代码见下。
#include
using namespace std;
enum weekday{mon=0,tue,wed,thu,fri,sat,sun};
int main()
{
void printweekday(enum weekday myday); //用于判断与返回结果
int y,m,d;
cout<<"请输入年月日:";
cin>>y>>m>>d;
if(m==1||m==2) {m+=12;y--;}
int w=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7;
weekday myday=(weekday)w;
printweekday(myday);
return 0;
}
void printweekday(enum weekday myday){
switch(myday)
{
case mon: cout<<5; break;
case tue: cout<<4; break;
case wed: cout<<3; break;
case thu: cout<<2; break;
case fri: cout<<1; break;
case sat:
case sun: cout<<0; break;
}
}