C语言——预处理指令、typedef、static、递归

 

一、预处理指令(所有的预处理指令都是以#开头)

      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\n", 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\n", 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("条件编译\n");
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\n", a); // 1
12     static int b = 0;
13     b++;
14     printf("b的值是%d\n", 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\n", c);
11     return 0;
12 }

 

    

      

           

     

posted @ 2015-03-22 19:42  某个人  阅读(306)  评论(0编辑  收藏  举报