2019年12月第一周

  • [ ]

枚举与结构体

枚举与宏定义都是用户自定义的数据类型。根据实际问题需要,定义自己的数据类型,具有很强的灵活性,但要使用好,必须牢记他们的使用规则,尤其是结构体类型,使用比较多。
在结构体变量中,各成员变量都占有自己的内存空间,是同时存在的。一个结构体类型的长度等于所有成员类型长度之和。

一、结构体、枚举有三种定义变量的方法:

1、先定义结构体(枚举类型),在说明结构体(枚举)变量。

#include<stdio.h>
int main()
{
	struct stu/*定义结构体变量*/
		{
			int a;
			char b;
			float c;
		}num1,num2;
	enum weekday/*定义结构体变量*/
	{sun,mon,tue,wed,thu,fri,sat}m,n;
	return 0;
}

2、在定义结构体(枚举)类型的同时说明结构体(枚举)变量。

#include<stdio.h>
int main()
{
	struct stu/*定义结构体变量*/
		{
		int a;
		char b;
		float c;
		};
		struct stu num1,num2;
	enum weekday{sun,mou,tue,wed,thu,fri,sat};/*定义结构体变量*/
	enum weekday m,n;
	return 0;
}

3、直接说明结构体(枚举)变量

#include<stdio.h>
int main()
{
	struct/*定义结构体变量*/
	{
		int a;
		char b;
		float c;
	}num1,num2;
	enum {sun,mou,tue,wed,thu,fri,sat}m,n;/*定义结构体变量*/
	return 0;
}

二、变量赋值

结构体和枚举的相似处还不止如此,变量的赋值也很相似。定义了结构体变量,该变量就也是这种结构。操作结构体变量用"."运算符,如上例,结构体变量赋值:

num1.a=102;
num1.b='A';
num1.c=1.23;

同理枚举变量赋值类似,但是枚举变量有定义类型(int),而枚举量为常量,不能赋值。

m=sun;
n=wed;

会很错误的的给枚举常量赋值

sun=1;
mon=3;
sun=mon;
//这些都是错误的

如果不给变量赋值,枚举值会按0,1,2,3,4····依次被赋值;即

sum=0;
mou=1;
tue=2;
wed=3;
thu=4;
fri=5;
sat=6;

这里有个小套路,在最后一个枚举值后在加一个;即

enum {sun,mou,tue,wed,thu,fri,sat,cnt}//cnt 默认值为7,即前面枚举值的个数

看了结构体,感觉离做一个管理系统又进了一步,枚举类型虽然不怎么好用,但是可以定义一组排比变量,看到枚举的变量让我不仅联想到了了另外一个好朋友:宏。

关于“#”

相信所有初学者都不会不知道“#include<stdio.h>”,这个“#”号开头的是预处理命令,如包含#incude,宏定义#define等。在源程序中这些命令都放在源文件的前面,称之为预处理部分。

宏定义

这里讲的是其中的宏定义。

#define 标识符 字符串/*"#"预处理命令,“define”宏定义命令,“标识符”所定义的宏名,“字符串”可以是常数、表达式、格式串等。

宏定义又分为无参宏定义和带参宏定义,其实就我觉得他们的区别也不是很大,只不过带参宏替换含变量可以用来做“函数”。
下面给出一个无参宏替换和带参宏替换的例子。

#include<stdio.h>
#define x 2//无参替换
#define x 1+1//无参替换
#define f(x) x*x//带参替换
int main()
{
	int a,b,c;
	a=x*2;
	b=x*2;
    c=f(2);
    printf("a=%d,b=%d,c=%d",a,b,c);
}
猜猜会输出什么,a和b的值2会一样吗?
	a=4,b=3,c=4/*b的值告诉我们宏替换没我们想象的那么聪明啊,根据值反推:b=1+1*2;因此宏替换适时要加上“()”。*/

补充一点,竟然宏替换没有那么聪明(只是个普通的搬运工),那么预处理时“字符串”后最好不要加上";"即不要写成这样:

#define 标识符 字符串;

宏定义深究

在Linux终端下

touch 1.c//新建一个文件
vim 1.c//将上面代码输入1.c
//编辑完成后wq保存
gcc 1.c --save temps//编译时保存临时文件
ls//显示当前所有文件

这时,你可以看到出来一个可执行文件a.out以外,还有:

1.i
1.o
1.c

通过命令

tali 1.i

可以看到一下代码

#include<stdio.h>
int main()
{
	int a,b,c;
	a=2*2;
	b=1+1*2;
    c=2*2;
    printf("a=%d,b=%d,c=%d",a,b,c);
}

可以看见全部预处理的标识符已经被替换了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值