c语言枚举enum共用体union

枚举enum共用体union

枚举(enum)

在实际编程中,有些数据的取值往往是有限的,只能是非常少的整数。并且最好为每个值取个名字,方便再后续代码使用

c 复制代码
#include <stdio.h>

#define MON 1
#define TUES 2
#define WED 3
#define THRUS 4
#define FRI 5
#define SAT 6
#define SUN 7

int main()
{
	int day=0;
	scanf("%d",&day);

	switch(day)
	{
		case MON:puts("星期一");break;//puts:输出字符串
		case TUES:puts("星期二");break;
		case WED:puts("星期三");break;
		case THRUS:puts("星期四");break;
		case FRI:puts("星期五");break;
		case SAT:puts("星期六");break;
		case SUN:puts("星期天");break;
	}

	return 0;
}

枚举的定义

枚举类型的定义格式:enum typeName{value1,value2,value3...};

enum是一个新的关键字,专门用来定义枚举,typeName是枚举类型的名字,value1,value2每个值对应的名字列表。
enum Week{Mon,Tues,Wed,Thurs,Fri,Sat,Sun};

枚举如果没有给值默认是从0依次加1,如果说中间有个枚举没给值那么会在前面一个枚举值+1
enum Week{Mon=1,Tues=2,Wed=3,Thurs=4,Fri=5,Sat=6,Sun=7}a,b,c;

使用枚举需要注意的问题:

  • 1.枚举列表中的Mon,Tues,Wed这些标识符的作用是全局的,不能定义和他名字相同的变量
  • 2.枚举列表中的值是整数
  • 3.Mon、Tues都是常量,不能对他们赋值,只能将他们的值赋给其他变量。

枚举值定义完基本就跟常量无意 不能修改只能赋值

共用体(联合体)(union)

结构体是一种构造类型或者复杂类型,它可以包含多个类型不同的成员,在C语言中,还有一种和结构体非常类似的语法,叫共用体(联合体)union。定义格式:

c 复制代码
union 共用体名{
    成员列表
};

共用体和结构体的区别:

  • 1.结构体的各个成员占用不同的内存,互相之间没有影响;而共用体的所有成员占用同一段内存,修改一个成员其余所有的成员都会受影响。
  • 2.结构体占用的内存大于等于所有成员占用的内存综合,共用体占用的内存等于最长的成员占用的内存。
  • 3.共用体同一时刻只能保存一个成员的值,如果对新的成员赋值,就会把原来的成员的值覆盖。
c 复制代码
union data{
      int a1;
      char a2;
}x,y;

union data a,b,c;

在共用体中,成员a1占4个字节,而char占一个字节,所以data类型的变量占4个字节。

c 复制代码
#include <stdio.h>
#define TOTAL 2
struct People
{
    char name[20];
    int num;
    char sex;
    char profession;
    union{
        float score;
        char course[20];
    }sc;
}bodys[TOTAL];


int main()
{
	for (int i = 0; i < TOTAL; ++i)//遍历数组并输入数据
	{
		printf("请输入名字:");
		scanf("%s",bodys[i].name);
		printf("请输入编号:");
		scanf("%d",&bodys[i].num);
		getchar();//接收回车符
		printf("请输入性别:");
		scanf("%c",&bodys[i].sex);
		getchar();
		printf("请输入职业:");
		scanf("%c",&bodys[i].profession);
		if(bodys[i].profession=='s')//如果职业为s,表示为学生
		{
			printf("请输入分数:");
			scanf("%f",&bodys[i].sc.score);
		}
		else
		{
			printf("请输入科目:");
			scanf("%s",bodys[i].sc.course);
		}
	}

	for (int i = 0; i < TOTAL; ++i)
	{
		if(bodys[i].profession=='s')//学生
		{
			printf("%s %d %c %c %.1f\n",bodys[i].name,bodys[i].num,bodys[i].sex,bodys[i].profession,bodys[i].sc.score );
		}
		else//老师
		{
			printf("%s %d %c %c %s\n",bodys[i].name,bodys[i].num,bodys[i].sex,bodys[i].profession,bodys[i].sc.course );
		}
	}

	return 0;
}

补充

main函数

main函数是程序的入口,在一个程序中只需要一个main函数,是程序中唯一的入口。

在函数调用时,main函数可以调用其他自定义函数,但是这些函数不能够调用main函数。

main函数(主函数)的形式:

c 复制代码
#include <stdio.h>

int main(int argc, char const *argv[])
{
	printf("argc:%d\n",argc);
	for (int i = 0; i < argc; ++i)
	{
		printf("%d %s\n",i,argv[i] );
	}
	return 0;
}

条件编译

c 复制代码
#if 条件1
    执行语句1
#elif 条件2
    执行语句2
#else
    执行语句3
#endif
  • 1.如果条件1满足,那么执行语句2和执行语句3就不会参与编译
  • 2.条件设置完毕之后,一定要加#endif,表示判断条件结束
c 复制代码
#include <stdio.h>

#define NUM 0

#if NUM
	void add(int a,int b)
	{
		printf("%d\n",a+b);
	}
#else
	void add(float a,float b)
	{
		printf("%f\n",a+b );
	}
#endif
//表示当宏NUM的值为1时,就会编译add整数相加函数,当NUM为0时,就会编译add浮点数相加函数。
int main()
{
	add(1,2);
	return 0;
}

#ifdef方式

c 复制代码
#ifdef 条件
    执行语句
#endif
c 复制代码
#include <stdio.h>
#define NUM 0
//表示只要NUM存在,就执行,而#if要条件满足才执行
#ifdef NUM
	void add(int a,int b)
	{
		printf("%d\n",a+b );
	}
#endif

int main()
{

	add(1,2);
	return 0;
}

如果NUM存在就编译add,不存在就不编译add
#if ,#ifdef区别 if是需要条件满足,ifdef只要存在就会执行哪怕为0

#ifndef方式

c 复制代码
#ifndef 条件
    执行语句
#endif

如果宏定义SUM不存在,add就会编译进来,如果存在,就不编译add

c 复制代码
#include <stdio.h>
//#define SUM 1
#ifndef SUM
	void add(int a,int b)
	{
		printf("%d\n",a+b );
	}
#endif
int main()
{
	add(1,2);
	return 0;
}

常见功能:头文件封装,当一个文件中重复引用同一个头文件时,编译的时候会出错,可以使用#ifndef来防止多次引用。

c 复制代码
#ifndef _XXX_H   判断该宏是否存在,不存在就加入编译
#define _XXX_H	避免头文件重复使用,定义文件对象加入
    语句
#endif

main.c

c 复制代码
#include "add.h"
#include "add.h"
int main()
{
	add(1,2);
	return 0;
}

add.h

c 复制代码
#ifndef _ADD_H
#define _ADD_H
	#include <stdio.h>
	void add(int a,int b)
	{
		printf("%d\n",a+b );
	}

#endif
相关推荐
偶像你挑的噻33 分钟前
4-Linux驱动开发-字符设备驱动
linux·运维·驱动开发
九年义务漏网鲨鱼34 分钟前
【大模型面经】千问系列专题面经
人工智能·深度学习·算法·大模型·强化学习
遇见火星1 小时前
Linux 网络性能测试实战:用 iperf3 精准测出真实带宽与丢包率
linux·网络·php·iperf3
赖small强1 小时前
【Linux驱动开发】Linux块设备驱动开发详解
linux·驱动开发·块设备·字符设备
qq_401700411 小时前
Linux 信号机制
linux·运维·服务器
!chen1 小时前
Zabbix 配置中文界面、监控告警以及Windows、Linux主/被监控模板
linux·windows·zabbix
_Stellar1 小时前
Linux 服务器配置 rootless docker Quick Start
linux·服务器·docker
源码之家1 小时前
机器学习:基于大数据二手房房价预测与分析系统 可视化 线性回归预测算法 Django框架 链家网站 二手房 计算机毕业设计✅
大数据·算法·机器学习·数据分析·spark·线性回归·推荐算法
Lv Jianwei1 小时前
Longest Palindromic Substring最长回文子串-学习动态规划Dynamic Programming(DP)
算法
石像鬼₧魂石1 小时前
Kali Linux 中对某(靶机)监控设备进行漏洞验证的完整流程(卧室监控学习)
linux·运维·学习