第九章预处理命令 学习目的与要求:1.掌握宏定义 2.重点掌握文件包含。 3.了解条件编译 重点:宏定义和文件包含 知识归纳 1.预处理命令 (1)C语言中有三种预处理命令:宏定义、文件包含和条件编译。 (2)预处理命令均以#开头,结尾没有分号。 (3)预处理命令在编译时执行 2.不带参数的宏定义 (1)概念:用一个符号代替一个字符串。 (2)格式:# define符号字符串 如# define pl3.1415926 宏常常用大写 3.带参数的宏定义 (1)概念:用一个带参数的符号代替字符串;不是简单的替换,还要进行参数替换 (2)格式:# define符号(参数)字符串 如# define s(a,b)a*b 注意:在带参数的宏定义中,参数如果是表达式,要注意将被替换的字符串中的参数 加(O)括起来,否则,替换结果不正确 如:# define s(a,b) ∥|行S(2+3,5+7); 编译时替换的结果是:2+3/5+7,显然不是想要得结果 如改成# define s(a,b)(a)/(b) ∥|行S(2+3,5+7) 编译时替换的结果是:(2+3)/(5+7) 4.文件包含 (1)概念:文件包含是指一个源文件可以将另一个源文件的全部内容包含进来 (2)格式:# include # include“文件名.扩展名
第九章 预处理命令 学习目的与要求:1. 掌握宏定义。 2. 重点掌握文件包含。 3. 了解条件编译。 重点:宏定义和文件包含 知识归纳 1. 预处理命令 (1) C 语言中有三种预处理命令:宏定义、文件包含和条件编译。 (2) 预处理命令均以#开头,结尾没有分号。 (3) 预处理命令在编译时执行。 2. 不带参数的宏定义 (1) 概念:用一个符号代替一个字符串。 (2) 格式:# define 符号 字符串 如 # define PI 3.1415926 宏常常用大写。 3. 带参数的宏定义 (1) 概念:用一个带参数的符号代替字符串;不是简单的替换,还要进行参数替换。 (2) 格式:# define 符号(参数) 字符串 如 # define S( a , b ) a * b 注意:在带参数的宏定义中,参数如果是表达式,要注意将被替换的字符串中的参数 加() 括起来,否则,替换结果不正确。 如: # define S( a , b ) a / b //执行 S( 2+3 , 5+7 ) ; 编译时替换的结果是: 2+3 / 5+ 7 ,显然不是想要得结果; 如改成 # define S( a , b ) (a ) / (b) //执行 S ( 2+3 , 5+7 ) ; 编译时替换的结果是: ( 2+3) /( 5+ 7) 4. 文件包含 (1) 概念:文件包含是指一个源文件可以将另一个源文件的全部内容包含进来。 (2) 格式:# include # include “文件名. 扩展名
第二部分¢语言程序设计同步训练 225 (3)两种格式的区别 用<>时,系统到存放C库函数头文件所在的目录中寻找要包含的文件;如果为调用库 函数使用文件包含命令,往往用尖括号,以节省时间 用“”时,系统先到用户当前目录(即存放当前程序的目录)查找要包含的文件,若找不 到,在到C库函数头文件所在的目录中寻找:如果要包含的是用户自己编写的文件(这种文 件一般都在当前目录中),一般用双引号 (4)常用包含的C库文件 使用数学函数时:# include 使用字符串函数时:# include 5.条件编译 (1)概念:条件编译是指符合条件就编译,不符合条件就不编译 (2)格式:# fifdef标识符 程序段1} else 程序段2} endif 还有另外两种格式,了解即可。 (3)注意区分:条件编译和选择结构;二者发生的阶段不同。 选择结构内容,全部编译,到运行时,根据条件是否成立决定运行哪一段代码。 条件编译内容,不是全部编译,根据条件是否成立决定编译哪一段代码。 注意区分:条件编译和函数调用。 基础训练(A) 填空题 1.C语言中有三种预处理命令 2.预处理命令均以 符号开头; 3.文件包含有哪两种格式: 4.定义宏的关键字是 5.宏定义分为 的宏定义和 的宏定义 6.预处理命令不是C语句,不必在行末加 7.要使用 strcpy函数,需要在使用前包含 文件。 要使用 sarto, fabs0函数,需要在使用前包含 文件 二、选择题 1.以下正确的描述是( A)C语言的预处理功能是指完成宏替换和包含文件的调用 B)预处理指令只能位于C源程序文件的首部 C)凡是C源程序中行首以”#”标识的控制行都是预处理指令
第二部分 C 语言程序设计同步训练 ·225· ·225· (3) 两种格式的区别 用时,系统到存放 C 库函数头文件所在的目录中寻找要包含的文件;如果为调用库 函数使用文件包含命令,往往用尖括号,以节省时间。 用“ ”时,系统先到用户当前目录(即存放当前程序的目录) 查找要包含的文件,若找不 到,在到 C 库函数头文件所在的目录中寻找;如果要包含的是用户自己编写的文件(这种文 件一般都在当前目录中) ,一般用双引号。 (4) 常用包含的 C 库文件 使用数学函数时:# include 使用字符串函数时:# include 使用输入输出函数时:# include 5. 条件编译 (1) 概念:条件编译是指符合条件就编译,不符合条件就不编译。 (2) 格式: #ifdef 标识符 { 程序段 1 } # else { 程序段 2 } # endif 还有另外两种格式,了解即可。 (3) 注意区分:条件编译和选择结构;二者发生的阶段不同。 选择结构内容,全部编译,到运行时,根据条件是否成立决定运行哪一段代码。 条件编译内容,不是全部编译,根据条件是否成立决定编译哪一段代码。 注意区分:条件编译和函数调用。 基础训练(A) 一、填空题 1. C 语言中有三种预处理命令:____________、____________、__________________。 2. 预处理命令均以_______符号开头; 3. 文件包含有哪两种格式:__________________________。 ____________________________。 4. 定义宏的关键字是__________________。 5. 宏定义分为___________的宏定义和_____________的宏定义。 6. 预处理命令不是 C 语句,不必在行末加___________。 7. 要使用 strcpy()函数,需要在使用前包含_________________文件。 要使用 sqrt(),fabs()函数,需要在使用前包含_________________文件。 二、选择题 1. 以下正确的描述是( )。 A) C 语言的预处理功能是指完成宏替换和包含文件的调用 B) 预处理指令只能位于 C 源程序文件的首部 C) 凡是 C 源程序中行首以”#”标识的控制行都是预处理指令
C语言程序设计上机指导与同步训练 D)C语言的编译预处理就是对源程序进行初步的语法检查 2.C语言的编译系统对宏命令的处理时()。 A)在程序运行时进行的 B)在程序连接时进行的 C)和C程序中的其他语句同时进行编译的 D)在对源程序中其他成分正式编译之前进行的 在“文件包含”预处理语句的使用形式中,当# nclude后面的文件名用 #define MUL(x,y)(x)*y in( (int a=3,b=4,ci C=MUL(a+l, b+2) printf("%d\n",c)i
·226· C 语言程序设计上机指导与同步训练 ·226· D) C 语言的编译预处理就是对源程序进行初步的语法检查 2. C 语言的编译系统对宏命令的处理时( )。 A) 在程序运行时进行的 B) 在程序连接时进行的 C) 和 C 程序中的其他语句同时进行编译的 D) 在对源程序中其他成分正式编译之前进行的 3. 在“文件包含”预处理语句的使用形式中,当#include 后面的文件名用(尖括号) 括起时,找寻被包含文件的方式是( )。 A) 仅搜索当前目录 B) 仅搜索源程序所在目录 C) 按系统设定的标准方式搜索目录 D) 先在源程序所在目录搜索,再按照系统设定的标准方式搜索 4. 在“文件包含”预处理语句的使用形式中,当#include 后面的文件名用“ ”(双括号) 括起时,找寻被包含文件的方式是( )。 A) 仅搜索当前目录 B) 仅搜索源程序所在目录 C) 直接按系统设定的标准方式搜索目录 D) 先在源程序所在目录搜索,再按照系统设定的标准方式搜索 三、问答题 文件包含中两种格式的区别是什么? 能力提高(B) 一、填空题 1. 若有宏定义如下: #define X 5 #define Y X+1 #define Z Y*X/2 则执行以下 printf 语句后,输出结果是_______。 int a; a=Y; printf(“%d\n”,Z); printf(“%d\n”,--a); 2. 请读程序,写出输出结果是:______________。 #include #define MUL(x,y) (x)*y main() { int a=3,b=4,c; c=MUL(a+1,b+2); printf(“%d\n”,c); }
第二部分¢语言程序设计同步训练 3.以下程序在宏展开后,赋值语句s的形式是 #define R 3.0 #define PI 3.14159 i fle printf(s=f\n”,s) 4.以下程序的输出结果是 #define DEBUG main() inta-14,b=15,c; #ifdef DEBUG #endif printf("c=dln”,c) 选择题 1.以下程序的运行结果是( #define MIN(x, y) (x)<(y )?(x):(y) i int i=10,j-15,k k=10*MIN(1,j); printf("d\n”,k) 程序段: ((A+1)*a) 正确的判断是( A)程序错误,不许嵌套宏定义 C)x=21 D)程序错误,宏定义不许有参数 3.以下程序段中存在错误的是()。 A)#define array size 100 int array [array size B)#define PI 3. 1415926 #define s(r) PI*(r)*(r)
第二部分 C 语言程序设计同步训练 ·227· ·227· 3. 以下程序在宏展开后,赋值语句 s 的形式是______________。 #define R 3.0 #define PI 3.14159 main() { float s; s=PI * R * R ; printf( “s=%f\n”, s); } 4. 以下程序的输出结果是__________。 #define DEBUG main() {int a=14,b=15,c; c=a/b; #ifdef DEBUG printf(“a=%d,b=%d,”,a,b); #endif printf(“c=%d\n”,c); } 二、选择题 1. 以下程序的运行结果是( )。 #define MIN(x,y) (x)<(y)?(x):(y) main() { int i=10,j=15,k; k=10*MIN(i,j); printf(“%d\n”,k); } A) 10 B) 15 C) 100 D) 150 2. 程序段: #define A 3 #define B(a) ((A+1)*a) … x=3*(A+B(7)); 正确的判断是( )。 A) 程序错误,不许嵌套宏定义 B) x=93 C) x=21 D) 程序错误,宏定义不许有参数 3. 以下程序段中存在错误的是( )。 A) #define array_size 100 int array[array_size]; B) #define PI 3.1415926 #define S(r) PI*(r)*(r) …
C语言程序设计上机指导与同步训练 area= s(3.2)i C)#define PI3.1415926 #define s(r) PI*(r)*(r) area= s(a+b)i D)#define PI3.1415926 #define s (r) PI*(r)*(r) area= s(a) 4.以下在任何情况下计算平方数时都不会引起二义性的宏定义是( A)#define POWER(x) B)#define POWEr(x)(x)*x C)#define POWER(x)(x*x) D)#define POWEr(x)((x)*(x)) 三、编程题 1.请分析一下一组宏所定义的输出格式 #define NL putchar('\n' #define PR(value) printf("value=gd t",(value)) fine PRTINTl (xl) PR(x #define PRTINT2(xl, x2) PR(xl)i PRTINTl(x2) 如果在程序中有以下的宏引用: PR(x) PRINTI( x) 写出宏展开后的情况,并写出应输出的结果,设x=12,x1=9,x2=38 2.编程,根据输入半径r,分别求圆的面积S,周长L,用带参宏实现,并输出结果。 链接二级考试 选择题 1.下列程序执行后的输出结果是() #define MA(x) x*(x-1) nal I int a=l, b=2; printf("sd \n", MA(1+a+b)):1 (2000年4月) 2.以下程序的输出结果是() D)1 # define SoR(x)X★X main() inta=16,k=2,m=1 a/=SQR(k+m)/SQR(K+m)i
·228· C 语言程序设计上机指导与同步训练 ·228· area= S(3.2); C) #define PI 3.1415926 #define S(r) PI*(r)*(r) … area= S(a+b); D) #define PI 3.1415926 #define S (r) PI*(r)*(r) … area= S(a); 4. 以下在任何情况下计算平方数时都不会引起二义性的宏定义是( )。 A) #define POWER(x) x*x B) #define POWER(x) (x)* x C) #define POWER(x) (x*x) D) #define POWER(x) ((x)*(x)) 三、编程题 1. 请分析一下一组宏所定义的输出格式: #define NL putchar(‘\n’) #define PR(value) printf(“value=%d \t”,(value)) #define PRTINT1(x1) PR(x1); NL #define PRTINT2(x1,x2) PR(x1); PRTINT1(x2) 如果在程序中有以下的宏引用: PR(x); PRINT1( x); PRINT2(x1,x2); 写出宏展开后的情况,并写出应输出的结果,设 x=12,x1=9,x2=38. 2. 编程,根据输入半径 r,分别求圆的面积S,周长L,用带参宏实现,并输出结果。 链接二级考试 一、选择题 1. 下列程序执行后的输出结果是( )。 A) 6 B) 8 C) 10 D) 12 #define MA(x) x*(x-1) main() { int a=1,b=2; printf("%d \n",MA(1+a+b));} (2000 年 4 月) 2. 以下程序的输出结果是( )。 A) 16 B) 2 C) 9 D) 1 #define SQR(X) X*X main() { int a=16, k=2, m=1; a/=SQR(k+m)/SQR(k+m);
第二部分¢语言程序设计同步训练 (2001年4月) 3.程序中头文件 typel. h的内容是 #define N 5 程序如下: #define [ int i i=Ml+M2; printf("d\n",i 程序编译后运行的输出结果是:( A)10z C)25 (2002年9月) 4.请读程序 #include(y)?(x):(y) a=5,b=2,c=3,d=3,t (2000年9月)
第二部分 C 语言程序设计同步训练 ·229· ·229· printf(“d\n”,a); } (2001 年 4 月) 3. 程序中头文件 typel.h 的内容是: #define N 5 #define M1 N*3 程序如下: #define “type1.h” #define M2 N*2 main() { int i; i=M1+M2; printf(“%d\n”,i); } 程序编译后运行的输出结果是:( )。 A) 10 z B) 20 C) 25 D) 30 (2002 年 9 月) 4. 请读程序: #include #define SUB(X,Y) (X)*Y main() { int a=3, b=4; printf("%d", SUB(a++, b++)); } 上面程序的输出结果是( )。 A) 12 B) 15 C) 16 D) 20 (1996 年 4 月) 二、填空题 1. 设有如下宏定义 #define MYSWAP(z,x,y) {z=x; x=y; y=z;} 以下程序段通过宏调用实现变量 a、b 内容交换,请填空。 float a=5,b=16,c; MYSWAP( ____________, a , b); (1996 年 4 月) 2. 以下程序的输出结果是 。 #define MAX(x,y) (x)>(y)?(x):(y) main() { int a=5,b=2,c=3,d=3,t; t=MAX(a+b,c+d)*10; printf(“%d\n”,t); } (2000 年 9 月)