预处理指令:以#号开头,可以写在任何位置,在编译之前执行
宏定义文件包含 条件编译
一:宏定义:无参数/有参数
NUM叫做宏名,6是用来替换宏名的字符串
#define NUM 6
#define sum(a,b) ((a)*(b))//这里需要括号括起来,防止复杂运算出错
@宏定义和函数虽然相似,但宏定义在编译之前作好计算,函数是在程序运行时调用,所以宏定义效率更高。
@宏定义不检测类型。但是替换之后,编译器会检查
@宏定义不涉及类型判断
二:条件编译:程序中需要哪段代码编译哪段
#define NUM 10//条件一般需要用到宏定义
#if 条件1//不可以放变量
。。。code1。。。 //如果条件1成立,则把code1编译进程序
#elif 条件2
。。。code2。。。
#else
。。。code3。。。
#endif
其他用法:
#if defined(MAX)//#if !defined(MAX)
。。。code。。。
#endif
#ifdef MAX//#ifndef MAX
三:文件包含:include
#include <文件名> :直接到C语言库函数头文件所在的目录中寻找文件
#include "文件名" :在原程序当前目录中寻找,若找不到,则在系统path中找,最后才在C语言库中找。
@允许嵌套包含,不允许递归包含(相互包含)
@防止头文件里面的内容重复包含:每一个头文件中都使用条件编译
变量类型:
C语言根据存储类型的不同,可以把变量分为:自动变量,静态变量,寄存器变量。
对应于存储的地方有3种:运行时堆栈,普通内存,硬件寄存器
@自动变量:被auto修饰的局部变量都是自动变量,默认情况下局部变量都是自动变量,auto可以省略;
全局变量不可能是自动变量:生命周期长 ,很多地方都有。
@静态变量:
1.包括所有全局变量。
2.static修饰的局部变量(即改变生命周期,但没有改变作用域)
@寄存器变量:存储在硬件寄存器中的变量
int main(){
register int a; //若寄存器不够用,则程序自动将寄存器变量转换为局部变量处理
return 0;
}
被register修饰的自动变量都是寄存器变量
只限于int , char 和指针类型的变量使用
一般将一些使用频繁的自动变量定义为寄存器变量,其他用内存。