黑马程序员--预处理指令、内部和外部函数、递归思想
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 ABC
2.作用
它的作用是在编译预处理时,将源程序中所有”宏名”替换成右边的”字符串”,常用来定义常量。
简单运用:
带参数的宏定义
1.一般形式
2.使用注意
1> 宏名和参数列表之间不能有空格,否则空格后面的所有字符串都作为替换的字符串
如果这样写,在替换average(10,4),会替换成(a,b) (a+b)/2(10,4);
2> 带参数的宏在展开时,只作简单的字符和参数的替换,不进行任何计算操作。所以在定义宏时,一般用一个小括号括住字符串的参数。所以在写带参数的宏的时候,最好都加上括号,每个变量加一个括号。
// 带参数的宏定义效率比函数高
条件编译:在很多情况下,我们希望程序的其中一部分代码只有在满足一定条件时才进行编译,否则不参与编译(只有参与编译的代码最终才能被执行),这就是条件编译。
1.条件编译 //写了#if 后面必须写#endif
文件包含(include)
1.<>表示系统自带的,“”表示自定义文件
2.不能互相包含,
外部函数:定义的函数能被本文件和其他文件访问,默认情况下所有函数都是外部函数
1不允许有同名的外部函数
内部函数:定义的函数只能被本文件访问
对全局变量的作用 static 定义一个内部变量 extern 声明一个外部变量
全局变量分2钟:
外部变量:
内部变量:static int b;
static对局部变量的作用: 1》延长局部变量的生命周期(程序结束的时候,局部变量才会被销毁)
2》并没有改变局部变量的作用域
适用场合
1.如果这个函数的调用频露特别高
2.这个函数内部的摸个变量值是固定不变的
/*递归
设计一个函数,用来计算b的n次方
运用递归的两个条件:
1.函数自己调用自己
2.必须有个明确的返回值
*/
/*宏定义
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; }
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- Mootools 1.2教程 函数
- autoit InputBox 函数
- 文件遍历排序函数
- Oracle 函数大全[字符串函数,数学函数,日期函数]第1/4页
- ASP下经常用的字符串等函数参考资料
- PostgreSQL教程(五):函数和操作符详解(1)
- DOS批处理 函数定义与用法
- asp Chr 函数 数字转字母的方法
- Lua中的函数精讲笔记
- Lua中的闭合函数、非全局函数与函数的尾调用详解
- Lua中调用C++函数示例
- Lua实现split函数
- Lua常用时间函数使用实例