一、预处理指令(所有的预处理指令都是以#开头)
1、 预处理指令分类
① 宏定义
② 条件编译
③ 文件包含
2、预处理指令在代码翻译成0和1之前执行
3、预处理的位置是随便写的
4、作用域:从编写指令的那一行开始,一直到文件结尾,可以用#undef取消宏定义的作用
(一)、宏
宏名一般用大写或者以k开头,变量名一般用小写
好处:宏的定义比函数的效率要高一些
1 #include <stdio.h> 2 3 int main() 4 { 5 char *name = "COUNT"; 6 7 printf("%s ", name); 8 9 #define COUNT 4//定义宏 10 11 int ages[COUNT] = {1, 2, 67, 89}; 12 13 14 15 for ( int i = 0; i<COUNT; i++) { 16 printf("%d ", ages[i]); 17 } 18 19 // 从这行开始,COUNT这个宏就失效 20 #undef COUNT
(二)、条件编译
当我们希望部分代码只有满足一定条件时候才进行编译,否则不参与编译。这就是条件编译。
1 #include <stdio.h> 2 3 4 // 只要写了#if,在最后面必须加上#endif 5 int main() 6 { 7 #ifndef A//条件编译 8 9 printf("条件编译 "); 10 #endif 11 return 0; 12 }
如上,如果满足条件A,就编译输出“条件编译”,否则,这部分代码不参与编译,直接到达return 0
(三)、 文件包含
同之前的include同文件的用法相同。
二、 typedef
1、 作用:给已经存在的类型起一个新的名称
2、 使用场合:
① 基本数据类型
1 typedef int MyInt; 2 typedef MyInt MyInt2;
② 指针
1 // 给指针类型char *起一个新的类型名称String 2 typedef char * String;
③ 结构体
1 typedef struct Person 2 { 3 int age; 4 } * PersonPoint; 5 // 定义结构体变量 6 struct Person p = {20}; 7 8 PersonPoint p2 = &p; 9
④ 枚举
1 typedef enum { 2 Man, 3 Woman 4 } MySex;
⑤ 指向函数的指针
1 typedef int (*MyPoint)(int, int); 2 3 int minus(int a, int b) 4 { 5 return a - b; 6 } 7 8 int sum(int a, int b) 9 { 10 return a + b; 11 }
三、 static和extern
1、外部函数:定义的函数能被本文件和其他文件访问
① 默认情况下所有函数都是外部函数
② 不允许有同名的外部函数
extern对函数的作用:
① 完整地定义一个外部函数
② 完整地声明一个外部函数
(extern可以省略,默认情况下声明和定义的函数都是外部函数)
1 extern void test();
2、 内部函数:定义的函数只能被本文件访问,其他文件不能访问
① 允许不同文件中有同名的内部函数
static对函数的作用:
① 定义一个内部函数
② 声明一个内部函数
1 static void test2() 2 { 3 4 }
3、static对局部变量的作用
static修饰局部变量的使用场合:
① 如果某个函数的调用频率特别高
② 这个函数内部的某个变量值是固定不变的
static修饰局部变量:
① 延长局部变量的生命周期:程序结束的时候,局部变量才会被销毁
② 并没有改变局部变量的作用域
1 #include <stdio.h> 2 3 int main() 4 { 5 static double pi = 3.14; 6 7 double zc = 2 * pi * 10; 8 9 int a = 0; 10 a++; 11 printf("a的值是%d ", a); // 1 12 static int b = 0; 13 b++; 14 printf("b的值是%d ", b); // 3 15 16 return 0; 17 }
四、 递归
递归的2个条件:
1、函数自己调用自己
2、必须有个明确的返回值
1 //用来计算b的n次方 2 3 #include <stdio.h> 4 int pow2(int b, int n); 5 6 int main() 7 { 8 int c = pow2(3, 2); 9 10 printf("%d ", c); 11 return 0; 12 }