C语言习题集合 预处理命令
谈C语言中的编译预处理运用技巧

・
3 ・ 0
Co u e r o 2 2 mp t r e a N .2 00
糖
和Ky9 eU ,其 原形 分别如下 :
K y rs K y s i s nee) e Pes( e A c t r i I g A
察 盈 如 响 守碲
温小斌
( 海南 是学信 , 学院 5 0 2 ) 7 28
编 译预 处理是 C语言的一个重要特 点。 它能改善 程序 设计的环境 ,有助于编写 易移 植、易调试 的程序 , 也是模
块化程序设计 的一 个工具 。 因此 , 对编译预 处理 灵活运用,
可以使程序结构优 良,更加易于 调试 和阅读 。
预处理语句主要有 “ 含文 件” 宏替换” 条件绵 包 、“ 、 译”三类 。
维普资讯
计 算机时代
20 0 2年 第 2期
・2 9・
谈C 语言中 编译 理运用 巧 的 预处 ‘ 技
徐善荣 ( 浙江工业 走学 3 0 1) 10 4
编译预处理是 在编译前对源程 序进 行的预加工 在 C 语 言的编译 系统中由预处理模块来 完成 其执行过程中是 这样的 : 先对源程序进行扫描 ,对 C语言中的几种预处 首
的源文件放在同一 目录下 ,而且在 nl 语句 中用 指 ic  ̄e
明路径 . 使得避 免在编译时发 生找不到包含文件的错误 。
值得 指出的是 :C程 序中是 由主函数 m 来调用 Mn0
自定 义函数 及标准 库函数 ,因此 ,程序若对某 一函数的调
用 ,则需要 i l 语 句嵌 入相应的头 文件 相应头文件 n  ̄c c 中的代码是 对相 应函数体 的原型用符号常量等进行说 明和
V 中的键 盘响应 事件 有三个 :K y r s e D w B e Pe ,K y o n s
c语言二级考试填空题和答案

c语言二级考试填空题和答案1. 在C语言中,用于定义变量的关键字是______。
答案:int2. 若有定义int a=5, b=9;,则表达式a++ + b--的值是______。
答案:143. 在C语言中,用于表示逻辑“与”操作的运算符是______。
答案:&&4. 下列哪个选项是C语言中的预处理命令?A. printfB. scanfC. includeD. main答案:C5. 若有定义int x=10;,则执行语句x %= 3;后,x的值是______。
答案:16. 在C语言中,用于定义函数的关键字是______。
答案:void 或者 int,取决于函数的返回类型7. 若有定义float a=2.5, b=4.7;,则表达式(int)a+b的值是______。
答案:6.78. 在C语言中,用于表示逻辑“或”操作的运算符是______。
答案:||9. 下列哪个选项是C语言中的合法标识符?A. 2variableB. variable2C. _variableD. variable-2答案:B、C10. 若有定义int x=10;,则执行语句x /= 2;后,x的值是______。
答案:511. 在C语言中,用于表示逻辑“非”操作的运算符是______。
答案:!12. 下列哪个选项是C语言中的合法常量?A. 0x1AB. 1.2e3C. 0123D. 0.1E答案:A、B、C13. 若有定义int x=5;,则执行语句x <<= 2;后,x的值是______。
答案:2014. 在C语言中,用于表示“等于”的比较运算符是______。
答案:==15. 下列哪个选项是C语言中的合法字符串?A. "Hello World"B. 'Hello World'C. "Hello\nWorld"D. "Hello\tWorld"答案:A、C、D16. 若有定义int x=10;,则执行语句x %= 5;后,x的值是______。
C语言 数据类型与宏定义

6
注意: 注意:
1)宏替换时仅仅是将源程序中与宏名相同的标识符替换 成宏的内容文本,并不对宏的内容文本做任何处理。 2)C语言程序员通常用大写字母来定义宏名,以便与变 量名相区别。 3 3)宏定义时,如果字符串太长,需要写多行,可以在行 尾使用反斜线“\”续行符。例如: #define LONG_STRING "this is a very long \ string that is used as an example" 注意双引号包括在替代的内容之内。
11
(9)在定义宏时,如果宏是一个表达式,那么一定要将这个表 )在定义宏时,如果宏是一个表达式, 达式用() ()括起来 达式用()括起来
#define X 10 #define Y 20 #define Z X+Y void main() { int a=2,b=3; a*=Z; b=b*Z; printf("a=%d,b=%d\n", a,b); }
19
文件包含两种格式
1)使用尖括号<>:直接到系统指定的“文件包含目 录去查找被包含的文件。 2)使用双引号” ”:系统首先到当前目录下查找被 包含文件,如果没找到,再到系统指定的“文件包 含目录”去查找。一般情况下,使用双引号比较保 险。 注意 ” ”之间可以指定包含文件的路径。如 #include”c:\\prg\\p1.h”表示将把C盘prg目录下的 文件p1.h的内容插入到此处(字符串中要表示‘\’, 必须使用‘\\’)。
22
void main() { 程序实例如下 float price1,price2,sumprice; 源程序 scanf("%f%f",&price1,&price 2); #define USA 0 sumprice=price1+price2; #define ENGLAND 1 printf("sum=%.2f%s",sumpri #define FRANCE 2 #define ACTIVE_COUNTRY ce,currency); } USA #if ACTIVE_COUNTRY==USA char *currency="dollar"; //有效 #elif ACTIVE_COUNTRY==ENG LAND char *currency="pound"; #else char *currency="france"; #endif
c语言程序设计(科学出版社)课后习题解答

第3章习题解答第1章1.C 言语程序主要由预处理命令、函数、注释等组成。
.2.填空(1)分号(2)main(3)stdio.h3.源程序:include<stdio.h>main( ){printf(“XXXXXXXXXXXXXXXXXXXXXXXXX\n〞); printf(“Hello World!\n〞);printf(“XXXXXXXXXXXXXXXXXXXXXXXXX〞);}4.源程序:include <stdio.h>main( ){int a, b, c; /X 定义变量X/scanf(“%d〞, &a); /X 输入第—个整数X/scanf(“%d〞, &b); /X 输入第二个整数X/c=a-b; /X 计算差X/printf(“%d-%d=%d〞,a,b,c); /X 输出结果X/}5.(1)<stdio.h>(2)x=10;(3)printf(“s=%d\n〞,s);第2章1.(1) c(2) a(3) b g(4) a d e(5) d2. a. 5 b. 295 c. 4 d. 29 e. 93. a.x=4,y=6b. x=4,y=3f.x=3,y=64. 165.include<stdio.h>main(){int a,b,c;scanf("%d%d",&a,&b);c=aXb;printf("%dX%d=%d",a,b,c);}第3章1.(1) b(2) b(3) d(4) a(5) b2.(1)&a,&b(2)l,s3. printf(“x=%.2f,y=%.2f\n〞,x,y);4.include<stdio.h>main(){int num1,num2,num3,sum;float average;scanf("%d%d%d",&num1,&num2,&num3);sum=num1+num2+num3;average=sum/3.0;printf("sum=%d,average=%.2f\n",sum,average);}5.include<stdio.h>main(){int hour,minute,second,total; /X 定义变量代表时、分、秒和总秒数X/ scanf("%d",&total);hour=total/3600;minute=total%3600/60;second=total%3600%60;printf("%dhours:%dminutes:%dseconds\n",hour,minute,second);}第4章1.(1) a(2) b(3) b(4) b(5) b2. 03.(1) 6(2) 4(3) 1(4) 14.include <stdio.h>main( ){int x,y;scanf("%d",&x);if (x>-5 &x<0)y=5Xx;if (x == 0)y=-1;if (x>0 &x<10)y=2Xx+1;printf("x=%d,y=%d\n",x,y);}5.include <stdio.h>main( ){int score,rank; /X score 表示成绩,rank 表示级别X/ printf("Please input score:");scanf("%d",&score);rank=score/10;switch(rank){case 10:case 9: printf("成绩等级为:A\n"); break;case 8: printf("成绩等级为:B\n"); break;case 7: printf("成绩等级为:C\n"); break;case 6: printf("成绩等级为:D\n"); break;default:printf("成绩等级为:E\n"); break; }}6.include<stdio.h>void main(){int n;printf("Please input the digit:");scanf("%d",&n);switch(n){case 1:printf("Jan \n");break;case 2:printf("Feb \n");break;case 3:printf("Mar \n");break;case 4:printf("Apr \n");break;case 5:printf("May \n");break;case 6:printf("Jun \n");break;case 7:printf("Jul \n");break;case 8:printf("Agu \n");break;case 9:printf("Sep \n");break;case 10:printf("Oct \n");break;case 11:printf("Nov \n");break;case 12:printf("Dec \n");break;}}第5章1.(1) b(2) a(3) b(4) d(5) d2. 7,13. y=-14. m=65. 10,146. 37. 58. ABABCDCD9.include <stdio.h>main ( )int i;long int sum=0;for (i=2;i<=200;i+=2)sum+=i;printf("2+4+6+...+200=%ld",sum); }10.include <stdio.h>main(){long int n;int sum = 0;printf("Please input the nber:"); scanf("%ld",&n);while(n != 0){sum += n % 10;n /= 10;}printf("%d\n", sum);}第6章1.(1) d(2) b(3) d(4) c(5) a2. 113. 34. 56895. 12,66. (1) i--(2) n7. (1) char k; (2) i<j8.include <stdio.h>main( ){float a10];int i;float sum=0,average;for (i=0;i<10;i++)printf("a%d]=",i);scanf("%f",&ai]);sum+=ai];}average=sum/10;printf("average is %.2f\n",average);}9.include <stdio.h>define N 10main( ){int aN],i,target,found;for (i=0;i<N;i++)scanf("%d",&ai]);printf("Please input a number:");scanf("%d",&target);i=0;while(i<N &target != ai])i++;found = i<Ni:-1;printf("%d\n",found);}10.include <stdio.h>define N 80main( ){char strN];int len=0,i=0;printf("Please input a string:");gets(str);while (stri++!= 0) len++;printf("the length of string is %d.\n",len); }第7章1. 212. 1363. 164. (1) func (2) m++5. 96. 1,6,3,2,37. 2,5,1,2,3,-28.include <stdio.h>int fun(int a,int b,int c);main( ){int a,b,c,max;printf("Please input three numbers:"); scanf("%d%d%d",&a,&b,&c);max=fun(a,b,c);printf("Max is %d.\n",max);}int fun(int a,int b,int c){int max;max= a>b(a>ca:c):(b>cb:c);return max;}9.include <stdio.h>long int sum(int n);main( ){int n;printf("n=");scanf("%d",&n);printf("Sum=%ld.\n",sum(n));}long int sum(int n){if (n = = 1 ) return 1;else return sum(n-1)+n;}10.include <stdio.h>void fun(n);main( ){int n;printf("n=");scanf("%d",&n);fun(n);}void fun(n)if (n = = 0) return;else{fun(n/2);printf("%-2d",n%2);}}第8章1.(1) b(2) d(3) b(4) c(5) c2. 83. 1234567894. 2 3 4 5 65. 3456. 1 2 3 4 5 67. bi8. bcdefgha9. p=sum10.include <stdio.h>include <string.h>main(){char str80];char Xp1, Xp2;gets(str);p1=str;p2=str+strlen(str)-1;while (p1<p2 &Xp1++ == Xp2-- ) ; puts( p1<p2 "不是回文" : "是回文" ); }第9章1.a. define F(x) (x)X(x)X(x)b. define F(x) (x)%4c. define F(x,y) (x)X(y)<1001:02.b. 4c. define DOUBLE(x) 2X(x)3. d4. -205. N is undefined6. 7.57. y=68.include <stdio.h>define SW AP(a,b) {int temp;temp=a;a=b;b=temp;}main(){int x,y;printf("x=");scanf("%d",&x);printf("y=");scanf("%d",&y);SWAP(x,y)printf("x=%d,y=%d.\n",x,y);}第10章1.struct student{int sno;char sname10];char sex;}stu1,stu2;2. 123. 合法的有a,b,dc.改成s.u.rectangle.length=25;e.改成s.u.circle.radius=5;f.改成s.u.circle.radius=5;4. a,b,c,d (说明:变量b 有确定的值之后,b++是合法的。
10程序设计实践7w -工程、预处理和EGG库C语言版

1.使用工程组织多个源文件
• 函数是最小的模块,若干个紧密相关的函数可 以组成更大的模块--源文件。 • 一条好的原则就是保持模块的紧凑性.即在同 一个源文件中只包含那些在逻辑上与其相关的 函数。
1.使用工程组织多个源文件
• 模块化:把程序划分成独立命名且可独立访问的模块, 每个模块完成一个子功能,所有模块集成起来构成的 整体可完成用户的所有需求。
#if 整型常量表达式1
文本1 #elif 整型常量表达式2 文本2 #else
文本1
#endif 第1种情况
其他文本
#endif
第3种情况 首先求常量表达式的值,然后根据常量表达式值是否为0进行 下面的条件编译。在第2种情况中,如果该表达式的值非0, 则编译文本1,否则编译其他文本。
条件编译
让编译器不编译某一段代码: #if 0 不编译的代码 #endif 以后若想让编译器编译该段代码,只需要将0改 成1
预处理指令 #define:宏
• 带参数的宏定义格式: – #define 标识符(形式参数表) 字符串 – 形式参数表由逗号分割开的标识符组成,这些 标识符在字符串中出现。 – 如:#define PI 3.14159 //常量定义 #define CIRCLE_AREA(x) (PI*(x)*(x)) #define MAX(x,y) ((x)>(y)?(x):(y)) #define NUL(x,y) ((x)*(y))
VC6环境下工程的创建
7.选择主菜单Project->Settings(工程->设置)出对话框(如下图)
VC6环境下工程的创建
8. 点击左边树状导航栏elevator,点击右边选项卡Link, 找到Object/library modules:文本框,在最后添加两项 Msimg32.lib、egg.lib(如图)点击OK
国开 C语言程序设计题库(下)

默认 C语言程序设计(548)(下)C程序中的所有预处理命令均以______字符开头。
答案:#C语言中的每条复合语句以________作为结束符。
答案:}C语言中的每条简单语句以________作为结束符。
答案:分号double类型的长度为________。
答案:8int类型的长度为________。
答案:4NULL是一个符号常量,通常作为空指针值,它对应的值为________。
答案:0short int类型的长度为________。
答案:2strcat()函数用于________两个字符串。
答案:连接strcpy函数用于把一个字符串________到另一个字符数组空间中。
答案:拷贝strlen()函数用于计算一个字符串的________。
答案:长度一个函数定义由________和函数体两部分组成。
答案:函数头下面函数的功能是从字节文件中依次读取每个整数并显示出来。
该字节文件名为参数fname所指向的字符串。
请在横线处填写合适内容。
void xw2(char* fname) {FILE *in=fopen(fname,"rb");int c,x;while(1) {c=fread(&x,sizeof(int),1,________);if(c==0) break;printf("%d ",x);}fclose(in);}答案:in下面函数的功能是从文本文件中依次用字符变量ch读入每个字符并显示出来。
该文本文件名为参数fname所指向的字符串。
请在横线处填写合适内容。
void xw2(char* fname) {FILE *fin=fopen(fname,"r");char ch;while(1) {ch=fgetc(________);if(ch!=EOF) printf("%c",ch);else break;}fclose(fin);}答案:fin下面函数的功能是求出字节文件中所有整数的最大值并返回。
国家二级C语言机试编译预处理和指针模拟试卷8_真题-无答案
国家二级C语言机试(编译预处理和指针)模拟试卷8(总分52,考试时间90分钟)1. 选择题1. 以下叙述中正确的是A. 在C语言中,预处理命令行都以”#”开头B. 预处理命令行必须位于C源程序的起始位置C. #include必须放在C程序的开头D. C语言的预处理不能实现宏定义和条件编译的功能2. 有以下程序,程序运行后的输出结果是#define PT 3.5;#define S(x)PT*x*x;main(){int a=1,b=2;printf("%4.1 f\n",S(a+b));}A. 31.5B. 7.5C. 程序有错无输出结果D. 14.03. 以下关于宏的叙述中正确的是A. 宏定义必须位于源程序中所有语句之前B. 宏名必须用大写字母表示C. 宏调用比函数调用耗费时间D. 宏替换没有数据类型限制4. 有以下程序,程序运行后的输出结果是#include #define S(x)4*(x)*x+1 void main() {int k=5,j=2;printf("%d\n",S(k+j));}A. 197B. 143C. 33D. 285. 设有宏定义:#define IsDIV(k,n)((k%n==1)?1:0)且变量m已正确定义并赋值,则宏调用:IsDIV(m,5)&&IsDIV(m,7)为真时所要表达的是A. 判断m是否能被5和7整除B. 判断m被5或者7整除是否余1C. 判断m被5和7整除是否都余1D. 判断m是否能被5或者7整除6. 有以下程序,程序运行后的输出结果是#include #define SUB(a)(a)-(a) main(){ int a=2,b=3,c=5,d;d=SUB(a+b)*c:printf("%d\n",d);}A. .12B. 0C. 10D. .207. 有以下程序,程序运行后的输出结果是#include #define fix)x*x*x main(){ int a=3,s,t;s=f(a+1);t=f((a+1));printf("%d,%d\n",s,t);} A. 10,10 B. 10,64C. 64,10D. 64,648. 有下列程序,程序的运行结果是#include #define N 5 #define M N+1 #define fix)(x*M) main() {int i1,i2;il=ff2);i2=f(1+1);printf("%d%d\n",i1,i2);}A. 12 7B. 12 12C. 11 11D. 11 79. 以下叙述中错误的是A. 预处理命令行的最后不能以分号表示结束B. C程序对预处理命令行的处理是在程序执行的过程中进行的C. #define MAX是合法的宏定义命令行D. 在程序中凡是以“#”开始的语句行都是预处理命令行10. 若程序中有宏定义行:#define N 100则以下叙述中正确的是A. 宏定义行中定义了标识符N的值为整数100B. 上述宏定义行实现将100赋给标示符NC. 在运行时用100替换标识符ND. 在编译程序对C源程序进行预处理时用100替换标识符N11. 若有以下程序,则程序的输出结果是#define S(x)x*x #define T(x)S(x)*S(x) main(){int k=5,j=2;printf("%d,%d\n",S(kI+j),T(k+j));}A. 17,37B. 49,2401C. 17,289D. 49,28912. 有以下程序,程序运行后的输出结果是#include<stdio.h>#define N 2 #define M N+1 #define NUM(M+1)*M/2 main(){printf("%d\n",NUM);}A. 4B. 8C. 9D. 613. 有以下程序,程序运行后的输出结果是#include #define SUB(X,Y)(X+1)*Y main(){int a=3,b=4;printf("%d\n",SUB(a++,b++));}A. 20B. 12C. 16D. 2514. 下面选项中关于编译预处理的叙述正确的是A. 凡是以≠}号开头的行,都被称为编译预处理命令行B. 预处理命令行必须使用分号结尾C. 预处理命令行不能出现在程序的最后一行D. 预处理命令行的作用域是到最近的函数结束处15. 有以下程序,程序的输出结果是#include<stdio.h>#define SQR(X)X*X main(){ int a=10,k=2,m:1;a|=SQR(k+m)/SQR(k+m);printf("%d\n",a);} A. 0 B. 1C. 9D. 1016. 以下叙述中正确的是A. 在包含文件中,不得再包含其他文件B. #include命令行不能出现在程序文件的中间C. 在一个程序中,允许使用任意数量的#include命令行D. 虽然包含文件被修改了,包含该文件的源程序也可以不重新进行编译和连接17. 有以下程序,程序的运行结果是#include #include int fun(int n) main() {int*p;{int a;p=(int*)malloc(sizeof(int));a=fun(10);*p=n;return*p;printf("%d\n",a+fun(10));} }A. 10B. 20C. 0D. 出错18. 有以下程序,程序运行后的输出结果是#include #include main() {int*a,*b,*c;a=b:c=(int*)malloc(sizeof(int));*a=1;*b=2,*c=3;a=b;printf("%d,%d,%d\n",*a,*b,*c);}A. 2,2,3B. 3,3,3C. 1,2,3D. 1,1,319. 有以下程序,程序运行后的输出结果是void fun(int*p1,int*p2,int*s) {s=(int*)malloc(sizeof(int));*s=*p1+*(p2++);} main(){int a[2]={1,2},b[2]={10,20},*s=a;fun(a,b,s);printf("%d\n",*s);}A. 10B. llC. 2D. 120. 有以下程序段int*p;p=_________malloc(sizeof(int));若要求使p指向一个int型的动态存储单元,在横线处应填入的是A. (int*)B. intC. int*D. (*int)21. 有以下程序,程序的输出结果是void fun(double*p1,double*p2,double*s) {s=(double*)calloc(1,sizeof(double));*s=*p1+*(p2+1):} main(){double a[2]={1.1,2.2},b[2]={10.0,20.0},*s=a;fun(a,b,s);printf("%5.2f\n",*s);} A. 1.10 B. 11.10C. 12.10D. 21.1022. 设有以下函数:void fim(int n,char,*s){……}则下面对函数指针的定义和赋值均正确的是A. void*pf();pf=fun;B. void(*pf)(int,char*);pf=fun;C. void*Pf();*pf=fun;D. void(*pf)(int,char);pf=&fun;23. 设有定义语句int(*f)(int);则以下叙述正确的是A. f是基类型为int的指针变量B. f是指向int类型一维数组的指针变量C. f是指向函数的指针变量,该函数具有一个int类型的形参D. f是函数名,该函数的返回值是基类型为int类型的地址24. 以下叙述中正确的是A. 指针变量只能通过求地址运算符(&)来获得地址值B. 语句“p=NULL;”与“p=\0;”是等价的语句C. “int*p1;int**p2;int*p3;”都是合法的定义指针变量的语句D. 语句p=NULL;执行后,指针p指向地址为0的存储单元25. 以下叙述中正确的是A. 函数的类型不能是指针类型B. 函数的形参类型不能是指针类型C. 基类型不同的指针变量可以相互混用D. 设有指针变量为“double*p”,则“p+1”将指针p移动8个字节26. 设有某函数的说明为int*func(int a[10],int n);则下列叙述中,正确的是A. 说明中的a[10]写成a[]或*a效果完全一样B. 形参a对应的实参只能是数组名C. func的函数体中不能对a进行移动指针(如a++)的操作D. 只有指向10个整数内存单元的指针,才能作为实参传给a。
计算机二级 C语言部分
C语言部分(2010秋)一、选择题(用答题卡答题,答案依次填在21~30答题号内,共10分)21.以下关于C源程序的叙述中,正确的是(21) 。
A.注释只能出现在程序的开始位置或语句后面B.一行中不能写多条语句C.一条语句可以分写在多行中D.一个源程序只能保存在一个文件中22.C源程序中的命令#include与#define是在(22) 阶段被处理的。
A.预处理B.编译C.连接D.执行23.以下语句中有语法错误的是(23) 。
A.printf("%d",0xAB); B.printf("%f",3.45E2.5);C.printf("%d",037); D.printf("%c", '\\');24.已有声明“int x=5,y;float z=2;”,以下表达式中语法正确的是(24) 。
A.y=x%z B.x>0?y=x:y=-xC.y=x/2=z D.y=x=z /225.已知字母A的ASCII码是65,字母a的ASCII码是97,变量c中存储了一个大写字母的编码。
若要求将c中大写字母编码转换成对应小写字母编码,则以下表达式中不能实现该功能的是(25) 。
A.c=tolower(c) B.c=c+32C.c=c-'A'+ 'a' D.c=(c+'A')%26-'a'26.一元二次方程ax2+bx+c=0有两个相异实根的条件是a≠0且b2-4ac>0,以下选项中能正确表示该条件的C语言表达式是(26) 。
A.a!=0,b*b-4*a*c>0 B.a!=0 || b*b-4*a*c>0C.a&&b*b-4*a*c>0 D.!a&&b*b-4*a*c>027.以下关于break和continue语句的叙述中正确的是(27) 。
C语言#define用法总结
C语言#define用法总结黄海涛,2012-3-3如果你还在为使用#define而迷茫,那请阅读这篇文章;如果读完之后你还在迷茫,那请哪天心情好了,再回来读一遍。
:)欢迎跟着我的思路走……一、概述1、宏定义在C语言中,以#开头的为预处理命令。
定义形式:2、本质其本质是:使用宏定义中的字符串替换(Substitution)宏名。
这只是一种简单的代换,预处理程序对它不作任何检查。
如有错误,只能在编译已被宏展开后的源程序时发现。
3、替换时机预处理是指在进行编译的第一遍扫描(词法扫描和语法分析)之前所作的工作。
由预处理程序负责完成。
在源程序被编译之前,宏替换已经完成,其流程如下:源程序→预处理程序→预处理后的源程序→编译器4、作用域其作用域为宏定义命令起到源程序结束。
如要终止其作用域可使用# undef命令。
5、优缺点▲优点:宏定义使用得当,可以防止出错,提高可移植性,可读性等等;减少函数调用的开销。
▲缺点:可能存在参数副作用;展开后可能比函数调用开销更大。
※规则一:保证在宏替换之后不会发生错误。
二、无参宏定义1、定义的一般形式#define identifier token-sequence#define 标识符字符串2、简单常量●约束1:宏名通常采用易读大写字母表示。
●约束2:宏定义不是说明或语句,在行末不必加分号,如加上分号则连分号也一起替换。
●约束3:宏名在源程序中若用引号引起来,则预处理程序不对其作宏替换。
如:3、字符串为表达式※规则二:无参宏定义中字符串为表达式(即含有运算符),必须加小括号()。
可见,有括号与无括号差别很大,请小心加括号,保证展开后是你所期望的。
参考规则一。
4、5、6三、带参宏定义对带参数的宏,在调用中,不仅要宏展开,而且要用实参去代换形参。
1、带参宏定义的一般形式为:#define identifier(identifier-list) token-sequence#define 宏名(形参表) 字符串在字符串中含有各个形参,形参是标识符。
C语言 函数 预处理
例6-1 文件包含预处理语句的使用
mymath.h的内容如下: # define ADD(x,y) (x+y) # define MUL(x,y) ((x)*(y)) # define PI 3.1415926 # define G 2.718 test.c内容如下: # include “mymath.h” main ( ) { int a=6,b=9; printf(“a+b=%d\n”,ADD(a,b)); printf(“a*b=%d\n”,MUL(a,b)); }
(5)使用宏次数多时,宏展开后源程序长,因为每 展开一次都使程序增长;而函数调用不使程序变长。 (6)宏替换不占用运行时间,而函数调用则占用运 6 行时间(分配内存单元、保护现场、值传递、执行 函数、返回函数值等)。
6.3 条件编译 .
在很多情况下,为了增强程序的可移植 性,C语言源程序中包含了各种版本的程序段, 但在某种情况下,只希望对一部分内容进行 编译,即为其指定编译的条件,此时称为条 件编译。
例6-3 带参数的宏定义 #define POWER(x) ((x)*(x)) main() { int y; scanf(“%d”,&y); printf(“y=%d, y*y=%d\n”,y, POWER(y)); }
从上述例题中可以看出,带参数的宏定义与函 数的使用非常相似,但二者是不同的。两者的区别 有如下几点: (1)函数调用时先求出实参的值,然后代入形参。 而带参数的宏定义只是进行简单的字符替换。 (2)函数调用是在程序运行时处理的,并分配临时 的内存单元。而宏展开则是在编译预处理时进行的, 在展开时并不分配内存单元,不进行值的传递,也 没有“返回值”。
第6章 编译预处理 章
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第六章 预处理命令 6.1 选择题 1. 下面叙述中正确的是( )。 A. 带参数的宏定义中参数是没有类型的 B. 宏展开将占用程序的运行时间 C. 宏定义命令是C语言中的一种特殊语句 D. 使用#include命令包含的头文件必须以“.h”为后缀 2. 下面叙述中正确的是( )。 A. 宏定义是C语句,所以要在行末加分号 B. 可以使用#undef命令来终止宏定义的作用域 C. 在进行宏定义时,宏定义不能层层嵌套 D. 对程序中用双引号括起来的字符串内的字符,与宏名相同的要进行置换 3. 在“文件包含”预处理语句中,当#include后面的文件名用双引号括起时,寻找被包含文件的方式为( )。 A. 直接按系统设定的标准方式搜索目录 B. 先在源程序所在目录搜索,若找不到,再按系统设定的标准方式搜索 C. 仅仅搜索源程序所在目录 D. 仅仅搜索当前目录 4. 下面叙述中不正确的是( )。 A. 函数调用时,先求出实参表达式,然后带入形参。而使用带参的宏只是进行简单的字符替换 B. 函数调用是在程序运行时处理的,分配临时的内存单元。而宏展开则是在编译时进行的,在展开时也要分配内存单元,进行值传递 C. 对于函数中的实参和形参都要定义类型,二者的类型要求一致,而宏不存在类型问题,宏没有类型 D. 调用函数只可得到一个返回值,而用宏可以设法得到几个结果 5. 下面叙述中不正确的是( )。 A. 使用宏的次数较多时,宏展开后源程序长度增长。而函数调用不会使源程序变长 B. 函数调用是在程序运行时处理的,分配临时的内存单元。而宏展开则是在编译时进行的,在展开时不分配内存单元,不进行值传递 C. 宏替换占用编译时间 D. 函数调用占用编译时间 6. 下面叙述中正确的是( )。 A. 可以把define和if定义为用户标识符 B. 可以把define定义为用户标识符,但不能把if定义为用户标识符 C. 可以把if定义为用户标识符,但不能把define定义为用户标识符 D. define和if都不能定义为用户标识符 7. 下面叙述中正确的是( )。 A.#define和printf都是C语句 B.#define是C语句,而printf不是 C.printf是C语句,但#define不是 D.#define和printf都不是C语句 8. 以下叙述中正确的是( )。 A. 用#include包含的头文件的后缀不可以是“.a” B. 若一些源程序中包含某个头文件;当该头文件有错时,只需对该头文件进行修改,包含此头文件所有源程序不必重新进行编译 C. 宏命令行可以看作是一行C语句 D. C编译中的预处理是在编译之前进行的 9. 下列程序运行结果为( )。 #define R 3.0 #define PI 3.1415926 #define L 2*PI*R #define S PI*R*R main() { printf("L=%f S=%f\n",L,S); } A. L=18.849556 S=28.274333 B. 18.849556=18.849556 28.274333=28.274333 C. L=18.849556 28.274333=28.274333 D. 18.849556=18.849556 S=28.274333 10.以下程序执行的输出结果是( )。 #define MIN(x,y) (x)<(y)?(x):(y) main() { int i,j,k; i=10;j=15; k=10*MIN(i,j); printf("%d\n",k); } A.15 B.100 C.10 D.150 11.下列程序执行后的输出结果是( )。 #define MA(x) x*(x-1) main() { int a=1,b=2; printf("%d \n",MA(1+a+b)); } A. 6 B. 8 C. 10 D. 12 12.以下程序的输出结果是( )。 #define M(x,y,z) x*y+z main() { int a=1,b=2, c=3; printf("%d\n", M(a+b,b+c, c+a)); } A. 19 B. 17 C. 15 D. 12 13.程序中头文件typel.h 的内容是( )。 #define N 5 #define M1 N*3 程序如下: #include "type1.h" #define M2 N*2 main() { int i; i=M1+M2; printf("%d\n",i); } 程序编译后运行的输出结果是( )。 A. 10 B. 20 C. 25 D. 30 14.请读程序: #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 15.执行下面的程序后,a的值是( )。 #define SQR(X) X*X main( ) { int a=10,k=2,m=1; a/=SQR(k+m)/SQR(k+m); printf("%d\n",a); } A. 10 B. 1 C. 9 D. 0 16.设有以下宏定义 #define N 3 #define Y(n) ((N+1)*n) 则执行语句:z=2 * (N+Y(5+1));后,z的值为( )。 A. 出错 B. 42 C. 48 D. 54 17.以下程序的输出结果是( )。 #define f(x) x*x main( ) { int a=6,b=2,c; c=f(a) / f(b); printf("%d\n",c); } A. 9 B. 6 C. 36 D. 18 18.有如下程序 #define N 2 #define M N+1 #define NUM 2*M+1 main() { int i; for(i=1;i<=NUM;i++) printf("%d\n",i); } 该程序中的for循环执行的次数是( )。 A. 5 B. 6 C. 7 D. 8 19.执行如下程序后,输出结果为( )。 #include #define N 4+1 #define M N*2+N #define RE 5*M+M*N main() { printf("%d",RE/2); } A.150 B.100 C. 41 D.以上结果都不正确 20.以下程序的输出结果是( )。 #define LETTER 0 main() { char str[20]= "C Language",c; int i; i=0; while((c=str[i])!=’\0’) { i++; #if LETTER if(c>=’a’&&c<=’z’) c=c-32; #else if(c>=’A’&&c<=’Z’) c=c+32; #endif printf("%c",c); } } A. C Language B. c language C. C LANGUAGE D. c LANGUAGE 6.2 填空题 1. 以下程序的输出结果是________。 #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); } 2. 下面程序的运行结果是________。 #define N 10 #define s(x) x*x #define f(x) (x*x) main() { int i1,i2; i1=1000/s(N); i2=1000/f(N); printf("%d,%d\n",i1,i2); } 3. 设有如下宏定义 #define MYSWAP(z,x,y) {z=x; x=y; y=z;} 以下程序段通过宏调用实现变量a、b内容交换,请填空。 float a=5,b=16,c; MYSWAP( 【1】 ,a,b); 4. 计算圆的周长、面积和球的体积 【1】 main() { float l,r,s,v; printf("input a radus: "); scanf("%f ", 【2】 ); l=2.0*PI*r; s=PI*r*r; v=4.0/3*( 【3】 ); printf("l=%.4f\n s=%.4f\n v=%.4f\n",l,s,v); } 5. 计算圆的周长、面积和球的体积 #define PI 3.1415926 #define 【1】 L=2*PI*R; 【2】 ; main() { float r,l,s,v;