C程序设计谭浩强.pptx
《C程序设计谭浩强.pptx》由会员分享,可在线阅读,更多相关《C程序设计谭浩强.pptx(20页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、 C C C C语言的一个重要特征是它的语言的一个重要特征是它的语言的一个重要特征是它的语言的一个重要特征是它的预处理功能预处理功能预处理功能预处理功能。我们知道,一。我们知道,一。我们知道,一。我们知道,一个高级语言源程序在计算机上运行,必须先用编译程序将其个高级语言源程序在计算机上运行,必须先用编译程序将其个高级语言源程序在计算机上运行,必须先用编译程序将其个高级语言源程序在计算机上运行,必须先用编译程序将其翻译为机器语言。编译包括词法分析、语法分析、代码生成、翻译为机器语言。编译包括词法分析、语法分析、代码生成、翻译为机器语言。编译包括词法分析、语法分析、代码生成、翻译为机器语言。编译包
2、括词法分析、语法分析、代码生成、代码优化等步骤,有时在编译之前还要做某些预处理工作,代码优化等步骤,有时在编译之前还要做某些预处理工作,代码优化等步骤,有时在编译之前还要做某些预处理工作,代码优化等步骤,有时在编译之前还要做某些预处理工作,如去掉注释,变换格式等。如去掉注释,变换格式等。如去掉注释,变换格式等。如去掉注释,变换格式等。C C C C语言允许在源程序中包含预处理语言允许在源程序中包含预处理语言允许在源程序中包含预处理语言允许在源程序中包含预处理命令,在正式编译之前(词法分析之前)系统先对这些命令命令,在正式编译之前(词法分析之前)系统先对这些命令命令,在正式编译之前(词法分析之前
3、)系统先对这些命令命令,在正式编译之前(词法分析之前)系统先对这些命令进行进行进行进行“预处理预处理预处理预处理”,然后整个源程序再进行通常的编译处理。,然后整个源程序再进行通常的编译处理。,然后整个源程序再进行通常的编译处理。,然后整个源程序再进行通常的编译处理。从语法上讲,这些预处理命令不是从语法上讲,这些预处理命令不是从语法上讲,这些预处理命令不是从语法上讲,这些预处理命令不是C C C C语言的一部分,但使用它语言的一部分,但使用它语言的一部分,但使用它语言的一部分,但使用它们却扩展了们却扩展了们却扩展了们却扩展了C C C C语言程序设计的环境,可以简化程序开发过程,语言程序设计的环
4、境,可以简化程序开发过程,语言程序设计的环境,可以简化程序开发过程,语言程序设计的环境,可以简化程序开发过程,提高程序的可读性,也更有利于移植和调试提高程序的可读性,也更有利于移植和调试提高程序的可读性,也更有利于移植和调试提高程序的可读性,也更有利于移植和调试C C C C语言程序。本章语言程序。本章语言程序。本章语言程序。本章主要介绍主要介绍主要介绍主要介绍宏定义宏定义宏定义宏定义、文件包括文件包括文件包括文件包括和和和和条件编译条件编译条件编译条件编译等预处理命令。等预处理命令。等预处理命令。等预处理命令。第1页/共20页源程序生成执行文件的过程:源程序生成执行文件的过程:源程序生成执行
5、文件的过程:源程序生成执行文件的过程:C C C C语语语语言言言言源源源源程程程程序序序序.c.c或或或或.cpp.cpp编译编译编译编译目目目目标标标标程程程程序序序序.obj.obj链接链接链接链接执执执执行行行行程程程程序序序序.exe.exe#include#include void main()void main()float r=4;float r=4;printf(“s=%fn”,PI*r*r);printf(“s=%fn”,PI*r*r);预处理命令预处理命令预处理命令预处理命令预处理预处理预处理预处理本章讨论之本章讨论之本章讨论之本章讨论之重点!重点!重点!重点!第2页/共
6、20页10.1 预处理命令简介 预处理命令:预处理命令:预处理命令:预处理命令:C C C C源程序中以源程序中以源程序中以源程序中以#开头、以换行符结尾的行开头、以换行符结尾的行开头、以换行符结尾的行开头、以换行符结尾的行 种类:种类:种类:种类:l l 宏定义宏定义宏定义宏定义#define#define、#undef#undefl l 文件包含文件包含文件包含文件包含#include#includel l 条件编译条件编译条件编译条件编译#if#if、#ifdef#ifdef、#else#else、#elif#elif、#endif#endif等等等等l l 其他其他其他其他#line#
7、line、#error#error、#program#program等等等等本章主要讨论的本章主要讨论的本章主要讨论的本章主要讨论的内容!内容!内容!内容!格式:格式:格式:格式:l l“#”“#”开头开头开头开头l l 占单独书写行占单独书写行占单独书写行占单独书写行l l 语句尾不加分号语句尾不加分号语句尾不加分号语句尾不加分号第3页/共20页10.2 宏定义 宏定义分为两种:宏定义分为两种:宏定义分为两种:宏定义分为两种:不带参数的宏定义不带参数的宏定义不带参数的宏定义不带参数的宏定义和和和和带参数的宏定义带参数的宏定义带参数的宏定义带参数的宏定义。1 1 1 1、不带参数的宏定义、不带
8、参数的宏定义、不带参数的宏定义、不带参数的宏定义 一般形式一般形式一般形式一般形式#define#define 标识符标识符标识符标识符 单词串单词串单词串单词串指令名称指令名称指令名称指令名称宏名,被定义代表宏名,被定义代表宏名,被定义代表宏名,被定义代表后面的单词串后面的单词串后面的单词串后面的单词串 宏体,是宏的内宏体,是宏的内宏体,是宏的内宏体,是宏的内容文本容文本容文本容文本 可缺省,表示宏名可缺省,表示宏名可缺省,表示宏名可缺省,表示宏名定义过或取消宏体定义过或取消宏体定义过或取消宏体定义过或取消宏体 功能功能功能功能 用指定标识符用指定标识符用指定标识符用指定标识符(宏名宏名宏名
9、宏名)代替字符序列代替字符序列代替字符序列代替字符序列(宏体宏体宏体宏体)如如如如#define YES 1#define YES 1#define NO 0#define NO 0#define OUT printf(“Hello,World”);#define OUT printf(“Hello,World”);#define#define SIZE SIZE 10 10#define#define INT_STRINT_STR%d%d void main()void main()int a int aSIZESIZE,i;,i;for(i=0;i for(i=0;i=0;i-)-1;i=
10、0;i-)printf(printf(INT_STRINT_STR,ai);,ai);宏定义宏定义宏定义宏定义void main()void main()int a int a1010,i;,i;for(i=0;i for(i=0;i=0;i-)-1;i=0;i-)printf(printf(%d%d,ai);,ai);预编译预编译预编译预编译处理后处理后处理后处理后 注意:宏替换时仅仅是将源程序中与宏名相同的注意:宏替换时仅仅是将源程序中与宏名相同的注意:宏替换时仅仅是将源程序中与宏名相同的注意:宏替换时仅仅是将源程序中与宏名相同的标识符替换成宏的内容文本,并不对宏的内容文本做标识符替换成宏
11、的内容文本,并不对宏的内容文本做标识符替换成宏的内容文本,并不对宏的内容文本做标识符替换成宏的内容文本,并不对宏的内容文本做任何处理。任何处理。任何处理。任何处理。第4页/共20页 宏定义注意事项宏定义注意事项宏定义注意事项宏定义注意事项 l l C C C C程序员通常用程序员通常用程序员通常用程序员通常用大写字母大写字母大写字母大写字母来定义宏名,以便与变量名区别。来定义宏名,以便与变量名区别。来定义宏名,以便与变量名区别。来定义宏名,以便与变量名区别。如:如:如:如:#define#define PIPIl l 宏定义的宏定义的宏定义的宏定义的位置任意位置任意位置任意位置任意,但,但,但
12、,但一般放在函数外面一般放在函数外面一般放在函数外面一般放在函数外面。l l 宏定义时,如果单词串太长,需要写多行,可以在行尾宏定义时,如果单词串太长,需要写多行,可以在行尾宏定义时,如果单词串太长,需要写多行,可以在行尾宏定义时,如果单词串太长,需要写多行,可以在行尾使用反斜线使用反斜线使用反斜线使用反斜线“”续行符续行符续行符续行符 例如:例如:例如:例如:#define LONG_STRING this is a very long string that is#define LONG_STRING this is a very long string that is used as a
13、n exampleused as an examplel l 宏名的宏名的宏名的宏名的作用域作用域作用域作用域是从是从是从是从#define#define定义之后直到该宏定义所在文定义之后直到该宏定义所在文定义之后直到该宏定义所在文定义之后直到该宏定义所在文件结束件结束件结束件结束 l l#undef#undef#undef#undef可可可可终止宏名作用域终止宏名作用域终止宏名作用域终止宏名作用域#undef#undef 标识符标识符标识符标识符#define YES 1#define YES 1void main()void main().#undef YES#undef YES#defi
14、ne YES 0#define YES 0void max()void max().YESYES原作用域原作用域原作用域原作用域YESYES新新新新作用域作用域作用域作用域l l 宏定义可以宏定义可以宏定义可以宏定义可以嵌套定义嵌套定义嵌套定义嵌套定义,但不能递归定义,但不能递归定义,但不能递归定义,但不能递归定义#define R 2.0#define R 2.0#define L 2*PI*R (#define L 2*PI*R ()#define S PI*R*R (#define S PI*R*R ()#define M M+10 (#define M M+10 ()l l 程序中字符
15、串常量即双引号中的字符,不作为宏进行宏程序中字符串常量即双引号中的字符,不作为宏进行宏程序中字符串常量即双引号中的字符,不作为宏进行宏程序中字符串常量即双引号中的字符,不作为宏进行宏替换操作替换操作替换操作替换操作#define XYZ this is a test#define XYZ this is a test printf(XYZ);printf(XYZ);输出:输出:输出:输出:XYZXYZ,而不是:,而不是:,而不是:,而不是:this is a testthis is a test。第5页/共20页 宏定义注意事项宏定义注意事项宏定义注意事项宏定义注意事项 l l 宏定义一般以宏
16、定义一般以宏定义一般以宏定义一般以换行结束换行结束换行结束换行结束,不要用分号结束,以免引起不,不要用分号结束,以免引起不,不要用分号结束,以免引起不,不要用分号结束,以免引起不必要的错误必要的错误必要的错误必要的错误#define PI#define PI 3.14;3.14;a=PI*2*2;a=PI*2*2;预编译预编译预编译预编译处理后处理后处理后处理后a=a=3.14;3.14;*2*2;*2*2;错误!错误!错误!错误!l l 宏可以被宏可以被宏可以被宏可以被重复定义重复定义重复定义重复定义。#define N 10#define N 10 /第一次宏定义第一次宏定义第一次宏定义第
17、一次宏定义int f()int f()N N的内容是的内容是的内容是的内容是1010 return(N*N);return(N*N);#define N 20#define N 20 /第二次宏定义第二次宏定义第二次宏定义第二次宏定义void main()void main()N N的内容是的内容是的内容是的内容是2020 printf(%dn,N+f();printf(%dn,N+f();l l 在定义宏时,如果宏是一个表达式,那么一定要将这个在定义宏时,如果宏是一个表达式,那么一定要将这个在定义宏时,如果宏是一个表达式,那么一定要将这个在定义宏时,如果宏是一个表达式,那么一定要将这个表达式
18、用()括起来,否则可能会引起非预期的结果。表达式用()括起来,否则可能会引起非预期的结果。表达式用()括起来,否则可能会引起非预期的结果。表达式用()括起来,否则可能会引起非预期的结果。#define NUM1 10#define NUM1 10#define NUM2 20#define NUM2 20#define NUM NUM1+NUM2#define NUM NUM1+NUM2 void main()void main()int a=2,b=3;int a=2,b=3;a*=a*=NUMNUM;b=b*b=b*NUMNUM;printf(a=%d,b=%dn,a,b);printf(
19、a=%d,b=%dn,a,b);void main()void main()int a=2,b=3;int a=2,b=3;a*=a*=10+20 10+20 ;b=b*b=b*10+20 10+20 ;printf(a=%d,b=%dn,a,b);printf(a=%d,b=%dn,a,b);预编译预编译预编译预编译处理后处理后处理后处理后输出结果:输出结果:输出结果:输出结果:a=60,b=50a=60,b=50()()()输出结果:输出结果:输出结果:输出结果:a=60,b=90a=60,b=90 第6页/共20页2 2 2 2、带参数的宏定义、带参数的宏定义、带参数的宏定义、带参数的宏
20、定义 一般形式一般形式一般形式一般形式#define#define 标识符标识符标识符标识符(参数列表参数列表参数列表参数列表)单词串单词串单词串单词串参数表由一个或多个参数构成,参数只有参参数表由一个或多个参数构成,参数只有参参数表由一个或多个参数构成,参数只有参参数表由一个或多个参数构成,参数只有参数名,没有数据类型符,参数之间用逗数名,没有数据类型符,参数之间用逗数名,没有数据类型符,参数之间用逗数名,没有数据类型符,参数之间用逗号隔号隔号隔号隔开,参数名必须是合法的标识符开,参数名必须是合法的标识符开,参数名必须是合法的标识符开,参数名必须是合法的标识符 通常会引用通常会引用通常会引用
21、通常会引用宏的参数宏的参数宏的参数宏的参数 例:例:例:例:#define S(a,b)a*b#define S(a,b)a*b .area=S(3,2);area=S(3,2);宏展开:宏展开:宏展开:宏展开:area=3*2;area=3*2;宏展开:宏展开:形参用实参换,其它字符保留形参用实参换,其它字符保留宏体及各形参外一般应加括号宏体及各形参外一般应加括号()()不能加空格不能加空格不能加空格不能加空格例例例例#define S#define S (r)PI*r*r(r)PI*r*r相当于定义了不带参宏相当于定义了不带参宏相当于定义了不带参宏相当于定义了不带参宏S S,代表字符串代表
22、字符串代表字符串代表字符串“(“(r)PI*r*r”r)PI*r*r”例例例例#define POWER(x)x*x#define POWER(x)x*x x=4;y=6;x=4;y=6;z=POWER(x+y);z=POWER(x+y);宏展开:宏展开:宏展开:宏展开:z=x+y*x+y;z=x+y*x+y;一般写成:一般写成:一般写成:一般写成:#define POWER(x)define POWER(x)(x x)*(x x)宏展开:宏展开:宏展开:宏展开:z=(x+y)*(x+y);z=(x+y)*(x+y);第7页/共20页#define MAX(x,y)(x)(y)?(x):(y)
23、#define MAX(x,y)(x)(y)?(x):(y).void main()void main()int a,b,c,d,t;int a,b,c,d,t;.t=MAX(a+b,c+d);t=MAX(a+b,c+d);宏展开:宏展开:宏展开:宏展开:t=(a+b)(c+d)?(a+b):(c+d);t=(a+b)(c+d)?(a+b):(c+d);int max(int x,int y)int max(int x,int y)return(x y?x:y);return(x y?x:y);void main()void main()int a,b,c,d,t;int a,b,c,d,t;
24、.t=max(a+b,c+d);t=max(a+b,c+d);【例例例例】用宏定义和函数实现同样的功能用宏定义和函数实现同样的功能用宏定义和函数实现同样的功能用宏定义和函数实现同样的功能第8页/共20页带参的宏与函数区别带参的宏与函数区别带参宏带参宏函数函数处理时间处理时间编译时编译时程序运行时程序运行时参数类型参数类型无类型问题无类型问题定义实参、形参类型定义实参、形参类型处理过程处理过程不分配内存,简单的不分配内存,简单的字符置换字符置换分配内存,先求实参值,分配内存,先求实参值,再代入形参再代入形参程序长度程序长度变长变长不变不变运行速度运行速度不占运行时间不占运行时间调用和返回占时间调
25、用和返回占时间第9页/共20页10.3 文件包含处理过程 功能功能功能功能 一个源文件可将另一个源文件的内容全部包含进来一个源文件可将另一个源文件的内容全部包含进来一个源文件可将另一个源文件的内容全部包含进来一个源文件可将另一个源文件的内容全部包含进来 一般形式一般形式一般形式一般形式#includeinclude 或或或或#includeinclude“包含文件名包含文件名包含文件名包含文件名”预编译时预编译时预编译时预编译时,用被包含文件的内容取代该预处理命令,再用被包含文件的内容取代该预处理命令,再用被包含文件的内容取代该预处理命令,再用被包含文件的内容取代该预处理命令,再对对对对“包含
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 程序设计 谭浩强
限制150内