共用体/联合体与枚举概念和使用

目录

1、关于共用体

2、关于枚举

3、【问题描述】根据输入年月日确定当前星期离周末还有几天。


1、关于共用体

共用体(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。

共用体/联合体与枚举概念和使用_第1张图片

这样写是不合法的。

11行给成员i初始化,那么下面的使用必须写为u1.i。

2、关于枚举

枚举是数组、结构体、共用体外的另一种构造类型。这种工具常用于创建符号常量。(枚举量为整型,可自动转换为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。

特别的,强制类型转换减弱了对枚举变量值的限制,简单看一眼书上讲的吧。

共用体/联合体与枚举概念和使用_第2张图片

(摘自c++primerP)

下面是一个实际使用的案例。

3、【问题描述】根据输入年月日确定当前星期离周末还有几天。

也就是根据日期判断星期几。

这里没再算是否闰年,偷懒于是直接使用了基姆拉尔森计算公式。(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;
    }
}

你可能感兴趣的:(算法,c++,经验分享,c语言)