码迷,mamicode.com
首页 > 编程语言 > 详细

黑马程序员--C语言--预处理指令、枚举、Typedef、递归函数、变量作用域

时间:2014-12-22 17:43:44      阅读:201      评论:0      收藏:0      [点我收藏+]

标签:

 

一、预处理指令

1>所有的预处理指令都是以#号开头;

2>预处理指令是在代码翻译成0,1之前执行;

3>预处理指令最后没有分号;

4>预处理指令的位置可以随便写;

5>预处理指令有作用域,从编写指令的那一行开始,一直到文件结尾,可以用#undef取消宏定义的作用;

预处理指令分3

 1> 宏定义

 2> 条件编译

 3> 文件包含

二、宏定义

1. 宏定义命名规则:

1>大写字母

 1 #define COUNT 

2>k开头首字母大写 #define kCount

2. 宏定义开始和结束,注意结尾处没有分号:

1 #define kCount 4
2 
3 ....
4 
5 #undef kCount
6 
7  
8 
9 char * name = “COUNT”;

则此时的COUNT不是宏定义,在双引号中的宏是字符串

 3. 带参数的宏定义,效率比函数高,

1 /*#define sum(v1, v2)  v1+v2  这种定义存在漏洞
2 
3 正确的书写格式应为:
4 */
5 #define  sum(v1,v2)  ((v1)+(v2))

这样可以让计算的结果为正确结果,要保持变量的整体性和表达式的整体性

注意:

1>表达式中几乎每一个参数都加小括号;

2>宏定义计算只是纯粹的文本替换;

3>宏定义是在编译时调用,函数是在运行时调用;

三、条件编译

条件编译格式:变量一般为宏定义名称

 1 //1>
 2 #if defined kCount /#ifdef kCount
 3 
 4 ...
 5 
 6 #endif
 7 //2>
 8 #ifndef kCount
 9 
10 ...
11 
12 #endif

条件编译和函数中的条件语句比较:

条件语句:

1>条件语句在编译时所有的if-else都要翻译成01

2>在程序运行时执行;

条件编译:

1>只有符合条件的语句翻译成0,1,其他条件不符合的不翻译;

2>在编译时执行;

四、文件包含

1><>表示的是系统自带的文件,“”表示的是用户自定义的文件;

2>不允许循环包含文件,例如:a.ha中包含b.hb.h中包含a.h

3>函数的声明可以引入多行,例如:

 1  #include “lisi.h”
 2 
 3 ...
 4 
 5 #include “lisi.h”
 6 
 7 #include <stdio.h>
 8 
 9 ...
10 
11 #include <stdio.h>

系统不会报错,但是不建议这样写

4>一般在头文件中写入:

 1 #ifndef  LISI_H
 2 
 3 #define  LISI_H 
 4 
 5 int sum(int v1, int v2);
 6 
 7 //.....
 8 
 9 //函数的声明;
10 
11 #endif

这样写目的:引入头文件是,进行判断,只引入一次头文件;#include “lisi.h”

5>头文件中定义的宏名,一般以头文件名称的大写LISI_H,定义的宏的值可以为空

#define  LISI_H  123 其中123可以不写

6>注意:一般一个头文件对应一个宏,宏名以头文件名命名

五、枚举类型

格式:enum 类型名称

{

1//注意此处为逗号,不是分号

2

...

};

 
enum Season

{

Spring;

Summer;

Autumn;

Winter;

};

enum Season s = 122;//这样定义的变量也是可以的,因为c语言为弱语言,所以这样可以通过

//枚举类型注意:

typedef enum {

    SexMan,

    SexWoman

} Sex;

//命名规范示例

六、Typedef

 1 Typedef作用:起别名
 2 //1>
 3 typedef int Interger;
 4 //2>
 5 typedef char * string;
 6 //3>
 7 typedef struct student stu;
 8 //4>
 9 typedef enum Season season;
10 //5>
11 typedef int (*MyPointer)(int, int);// 指向函数的指针
12 6>
13 typedef struct Person
14 
15 {
16 
17 int age;
18 
19 } myPerson;
20 
21 7>typedef enum Week
22 
23 {
24 
25 monday;
26 
27 tuesday;
28 
29 wendsday;
30 
31 } myWeek;
32 
33  
34 //使用宏定义起别名:
35 //1>
36 #define  Interger  int
37 
38 #define  string  char *
39 //2>
40 typedef  int  Interger;
41 
42 typedef  char *  string;

七、递归函数

递归的两个条件:

1>函数自己调用自己;

2>必须有个明确的返回值。

递归函数的步骤:

1>找规律,找出前一个数据跟当前数据的关系(一般为归纳数列);

2>找出可以设置特定值的数值,一般为最小数值的位置,例如n=1

3>

1 int pow2(int b, int n)
2 
3 {
4 
5 if(n<=0) return 1;
6 
7 return pow2(b,n-1)*b;
8 
9 }

根据列出的关系式书写函数,例如此函数的关系表达式:bn次方 = bn-1次方*b;

直接将此关系式套用到pow2(b,n-1)*b中;

递归函数最重要的是找规律。

 

八、Externstatic

区别:

Exter外部函数,定义的函数可以被本文件和其他文件访问,不允许有两个名称相同的文件;

Static内部函数,定义的函数只能被本件访问,其他文件不能访问,如果要访问,可以利用extern函数间接访问;

 

static修饰局部变量的使用场合:

1>如果某个函数的调用频率特别高;

2>这个函数内部的某个变量值是固定不变的;

黑马程序员--C语言--预处理指令、枚举、Typedef、递归函数、变量作用域

标签:

原文地址:http://www.cnblogs.com/zsling/p/4178436.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!