本帖最后由 鸦领主 于 2021-1-8 13:38 编辑
1.预编译语句
a)#define:常量定义,原理是编译器强制替换
#define p 12.566
int i=10;
double d=i*i*p;//这里编译器会将p替换为12.566
宏函数
#include<stdio.h>
#define max(a,b) a>b?a:b; //这俩个函数同理,比真实的函数节省系统资源
/*int max(int a, int b) //编译出来的文件尺寸可能会大些
{//求最大值
return a > b ? a : b;
}*/
int main()
{
int n = 10, b = 32;
max(n,b)
return 0;
}
b).typedef:是用于对类型重新定义
书写上define定义的类型名在前结尾不加分号,而typedef类型名在后加分号。
typedef int time;//将int取一个新名字叫time,类项名可自定义
#define time int //将int取一个新名字叫time,类项名可自定义
struct used
{
time a;
used*u;
};
typedef used* New;//这里直接是将used*定义成了New
new a = NULL; //New等于used*,也不用再加*号
#define next int *;
//与define定义的区别是
New p , p1;//俩个都是指针变量型,都是used*
next a1,a2;//只有第一个是指针变量,后面的都是整数类型的
</span>
将不好书写的语句,定义成方便书写的
typedel unsigned int uint
//定义unsigned int 类型的方便
uint i=32;//unsigned int 类型
c)include包含语句#include<stdio.h>//尖括号表示只在系统文件中找到包含
#include"stdio.h"//双引号表示优先在当前工程目录下查找,没有在去系统文件中
d)ifdef
#include<stdio.h>
#define test //加上这句ifdef里面的东西将会执行,else里面不会执行,否者相反
int main()
{
#ifdef test//可自定义名
printf("当前是测试");
#else
printf("当前是正版");
#endif //结束
return 0;
}
2.常量定义
定义方式包括#define const enum
const定义的方式
const int i=12//定义的这个数将不能修改
//必须初始化指定值,也只能再初始化时指定值
enum整数常量定义方式
enum Etest
{
test,
test1,
test2=45,
test3,
};
如果第一个常数未指定那么默认为0,依次向下+1
如果遇到指定了,那么会变成指定了那个数,在依次向下+1
使用枚举系列定义常量的优点是可以自动无重复
列如:大量通讯协议中,协议号的定义
2.常量指针和指针常量
const int i=10;
const int *p=&i;//这个叫做常量指针
int t=10;
int* const p1=&t;//这个叫做指针常量
常量指针的特点:禁止赋值,允许偏移,允许读取
*p = 32;//错误,不可以赋值
p = p+1//正确,允许偏移
int c =*p //正确,允许读取
指针常量的特点:允许赋值,禁止偏移,允许读取
*p = 32;//正确,可以赋值p = p+1//错误,不允许偏移
int c =*p //正确,允许读取
3.位结构体
struct结构体名
{
成员类型 成员变量名:位;(常量)
成员类型 成员变量名:位;(常量)
};
一个结构体有32位 可以分配,可以合理的利用
位就是二进制数的一位数,比如分配3位,那么能使用的数就是0-7
一般成员类型前都加unsigned,如果有符号的话过半就会变成负数
|