您的位置:首页 > 职场人生

黑马程序员--预处理指令、内部和外部函数、递归思想

2015-07-28 14:23 302 查看
——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-

/*宏定义

1.C语言在对源程序进行编译之前,会先对一些特殊的预处理指令作解释(比如之前使用的#include文件包含指令),产生一个新的源程序(这个过程称为编译预处理),之后再进行通常的编译

2.所有预处理指令都是以#开头

3.预处理指令分3钟

4.宏定义 条件编译 文件包含

5.预处理指令在代码翻译成0和1之前执行

6.预处理指令文职可随便写(与处理指令作用域:从编写指令的哪一行开始,一直到文件结尾)

7.宏名一般用大写或者以k开头,变量名一般用小写

*/

一、不带参数的宏定义

1.一般形式

#define 宏名 字符串
#define ABC 10


右边的字符串也可以省略,比如#define ABC

2.作用

它的作用是在编译预处理时,将源程序中所有”宏名”替换成右边的”字符串”,常用来定义常量。

简单运用:

#define COUNT 5

int main()
{
int ages[COUNT] = {1, 2, 4, 7, 8,};

for (int i = 0; i<COUNT; i++)
{
printf("%d\n",ages[i]);

#undef COUNT//从这行开始,COUNT这个宏就失效
return 0;
}
}


带参数的宏定义

1.一般形式

#define 宏名(参数列表) 字符串
#define average(a, b) (a+b)/2


2.使用注意

1> 宏名和参数列表之间不能有空格,否则空格后面的所有字符串都作为替换的字符串

#define average (a, b) (a+b)/2


如果这样写,在替换average(10,4),会替换成(a,b) (a+b)/2(10,4);

2> 带参数的宏在展开时,只作简单的字符和参数的替换,不进行任何计算操作。所以在定义宏时,一般用一个小括号括住字符串的参数。所以在写带参数的宏的时候,最好都加上括号,每个变量加一个括号。

// 带参数的宏定义效率比函数高

#define sum(v1,v2) ((v1)+(v2))//参数加括号
int main()
{

int c = sum(2, 3) * sum(6, 4);
}


条件编译:在很多情况下,我们希望程序的其中一部分代码只有在满足一定条件时才进行编译,否则不参与编译(只有参与编译的代码最终才能被执行),这就是条件编译。

1.条件编译 //写了#if 后面必须写#endif

#define A 10
int main()
{
#if (A == 10)
printf("A=10\n");
#elif (A == 5)
printf("A=5\n");
#else
printf("a是其他值\n");
#endif//结束
return 0;
}


文件包含(include)

1.<>表示系统自带的,“”表示自定义文件

2.不能互相包含,

#ifndef LISI_H
#define LISI_H
int sum(int a, int b);
#endif


外部函数:定义的函数能被本文件和其他文件访问,默认情况下所有函数都是外部函数

1不允许有同名的外部函数

内部函数:定义的函数只能被本文件访问

extern void test() //extern 可省略
{
printf("iuhdi\n");
}
static void test2()//内部函数
{
printf("uguhb\n");
}

int main()
{

return 0;
}


对全局变量的作用 static 定义一个内部变量 extern 声明一个外部变量

全局变量分2钟:

外部变量:

内部变量:static int b;

static对局部变量的作用: 1》延长局部变量的生命周期(程序结束的时候,局部变量才会被销毁)

2》并没有改变局部变量的作用域

适用场合

1.如果这个函数的调用频露特别高

2.这个函数内部的摸个变量值是固定不变的

/*递归

设计一个函数,用来计算b的n次方

运用递归的两个条件:

1.函数自己调用自己

2.必须有个明确的返回值

*/

#include <stdio.h>

int pow2(int b, int n);

int main()
{
int c = pow2(10, 6);

printf("%d",c);

return 0;
}

int pow2(int b, int n)
{
int result = 1;
/*
result *= b;
result *= b;
result *= b;
...
n次
*/
for (int i = 0; i<n; i++)
{
result *= b;
}
return result;
}
// 第二种方法(利用递归思想)

int pow3(int b, int n)
{
if (n <=
4000
0) return 1;//明确的返回值
return pow2(b, n-1)* b;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ios 函数