C语言习题集合(预处理命令)

合集下载

C语言习题集(预处理命令篇)

C语言习题集(预处理命令篇)

第六章预处理命令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.下面叙述中正确的是()。

C语言程序设计习题集3

C语言程序设计习题集3
if(substr [【8】k+1]==’\0’)
{ num++ ; break ; }
return (num);
}
4下面函数的功能就是用递归法将一个整数存放到一个字符数组中,存放时按逆序存放,如483存放成“384”,请填空使程序完整。
void convert(char *a, int n)
{ int i;
A*pxBaCpxD&a
9若指针px为空指针,则_B__。。
A px指向不定B px的值为零C px的目标为零D px的地址为零
10对下语句int *px[10];,下面正确的说法就是_B__。
A px就是一个指针,指向一个数组,数组的元素就是整数型。
B px就是一个数组,其数组的每一个元素就是指向整数的指针。
A语句有错误B z值为68 Cz值为60 D z值为180
4以下程序运行后的输出结果就是_A__。
#define F(X,Y)(X)*(Y)
main()
{int a=3,b=4;
printf("%d\n",F(a++,b++));
}
A 12B15C16D 20
5以下程序运行后的输出结果就是_C__。
{int a[5]={2,4,6,8,10}, *p;
p=a; p++;
printf("%d", *p);
}
4以下程序的输出结果就是__55__。
#defineM5
#defineNM+M
main()
{int k;
k=N*N*5; printf("%d\n",k);

C语言 第九章 预处理命令

C语言 第九章 预处理命令
第九章 预处理命令
目的: 简化程序的编写 ; 提高程序的模块化、可读性、可移植性。
有三种类型的预处理命令: 1. 宏定义命令; 2. 文件包含命令; 3. 条件编译命令。
为了与C语句区别,这些命令均以“ # ”开头。
处理流程: 第一次编译扫描时,将预编译命令处理完, 然后再进行正式编译,生成目标代码。
#define f(a)
(a)* b
若有:f(x+y) 则应有:
(x+y)b
若有:f(x+y+z) 则应有:
预编译后, z = f(x+y) 变成: z = x+y*b 结果为: z=31
(x+y+z)b
(这个结果与初始设想不一致)
“带参数宏定义” 必须注意以下几个方面: 1. 宏定义时要考虑实参(替换)的各种可能, 防止出 现二义性。
3. #include后的文件名既可用“ ”,也可用< >, 二者区别:
“ ”首先在当前目录中找,然后再去标准目录中找。
< > 只在标准目录(include目录)中找。
为提高预处理的搜索效率,通常对自定义的 非标准头文件使用方式一;而对系统提供的标准 头文件(如:math.h、stdio.h等)使用方式二。
将返回值 6 将返回值 8
但二者还是有区别的:
1) 宏替换在预编译时进行;
而函数调用在程序运行时进行
2) 宏展开时,仅仅是将宏体中的形参简单 地置换为实参,不计算实参值,也不会带来任何 返回值; 而函数调用要进行: l 计算实参值(假定用 2+3、 9–1作为实参将 被计算出来)、 l参数传递(将 5、8 传给形参x、y)、
这些文件要用到公用信息时,只要在文件 中加入#include “f.h”这么一行命令既可。这样 就不必在f1.c、…… 、fn.c每个文件中都去重 复定义这些公用的信息。

C语言预处理命令总结大全.docx

C语言预处理命令总结大全.docx

C语言预处理命令总结大全(2012-02-13 17:18)标签:C语言预处理分类:C编程C程序的源代码中可包括各种编译指令,这些指令称为预处理命令。

虽然它们实际上不是C语言的一部分,但却扩展了C程序设计的环境。

本节将介绍如何应用预处理程序和注释简化程序开发过程,并提高程序的可读性。

ANSI标准定义的C 语言预处理程序包括下列命令:#defi ne ,#error ,# in elude , #if , #else , #elif , #en dif , #ifdef , #if ndef , #undef, #line , #pragma等。

非常明显,所有预处理命令均以符号#开头,下面分别加以介绍。

命令#define定义了一个标识符及一个串。

在源程序中每次遇到该标识符时,均以定义的串代换它。

ANSI标准将标识符定义为宏名,将替换过程称为宏替换。

命令的一般形式为:#define identifier string1该语句没有分号。

在标识符和串之间可以有任意个空格,串一旦开始,仅由一新行结束。

2宏名定义后,即可成为其它宏名定义中的一部分。

3宏替换仅仅是以文本串代替宏标识符,前提是宏标识符必须独立的识别出来,否则不进行替换。

例如:#defi ne XYZ this is a tes使用宏printf("XYZ") ;//该段不打印"this is a test"而打印"XYZ"。

因为预编译器识别出的是"XYZ"4如果串长于一行,可以在该行末尾用一反斜杠’\'续行。

#defi neLONG_STRING"this is a very long\stri ng that is used as an example"5 C语言程序普遍使用大写字母定义标识符。

6用宏代换代替实在的函数的一大好处是宏替换增加了代码的速度,因为不存在函数调用的开销。

C语言的预处理命令有哪些?

C语言的预处理命令有哪些?

问:关于C语言中的预处理命令?答:我们可以在C源程序中插入传给编译程序的各种指令,这些指令被称为预处理器指令(等价于汇编语言中的伪指令),它们扩充了程序设计的环境。

现把常用的预处理命令总结如下:1. 预处理程序按照ANSI标准的定义,预处理程序应该处理以下12条指令:#if、#ifdef、#ifndef、#else、#elif、#endif、#define、#undef、#line、#error、#pragma、#include。

显然,所有的12个预处理指令都以符号#开始,,每条预处理指令必须独占一行。

2. #define#define指令定义一个标识符和一个串(也就是字符集),在源程序中发现该标识符时,都用该串替换之(原样替换,不要附加任何人为理解上的符号)。

这种标识符称为宏名字,相应的替换称为宏代换。

一般形式如下:#define macro-name char-sequence这种语句不用分号结尾。

宏名字和串之间可以有多个空格符,但串开始后只能以新行终止。

在C语言里宏定义只用来做的宏名替换,而不做语法检查的,因而它不是C语句,所以宏定义的语句结尾不需要加分号。

宏也在C里也叫预处理命令,因为宏是在程序编译前先进行字符替换的,所以叫预处理.例如:我们使用LEFT代表1,用RIGHT代表0,我们使用两个#define指令:#define LEFT 1#define RIGHT 0每当在源程序中遇到LEFT或RIGHT时,编译程序都用1或0替换。

定义一个宏名字之后,可以在其他宏定义中使用,例如:#define ONE 1#define TWO ONE+ONE#define THREE ONE+TWO宏代换就是用相关的串替代标识符。

因此,如果希望定义一条标准错误信息时,可以如下定义:#define ERROR_MS “Standard error on input \n”如果一个串长于一行,可在行尾用反斜线”\”续行,如下:#define LONG_STRING “This is a very very long \s tring that is used as an example”3. #error#error指令强制编译程序停止编译,它主要用于程序调试(放在错误的分支中,一旦进入错误的分支就显示该信息)。

C语言程序设计第八章预处理命令

C语言程序设计第八章预处理命令

C语言程序设计第八章预处理命令一、选择题1、对宏命令的处理是_ ___A、在程序执行时进行的B、在对程序中其他语句进行编译前进行的C、在程序连接时进行的D、与程序中其他语句同时进行编译2、下面对编译预处理的叙述正确的是_ _____A、预处理命令只能位于程序的开始处B、预处理功能是指完成宏替换和文件包含的调用C、只要行首以“#”标识的控制行都是预处理命令D、编译预处理就是对源程序进行初步的语法检查3、以下叙述中不正确的是()。

A)预处理命令行都必须以#号开始B)在程序中凡是以#号开始的语句行都是预处理命令行C)C程序在执行过程中对预处理命令行进行处理D)以下是正确的宏定义#define IBM-PC4、以下叙述中正确的是()。

A)在程序的一行上可以出项多个有效的预处理命令行B)使用带参的宏时,参数的类型应与宏定义时的一致C)宏替换不占用运行时间,只占编译时间D)在以下定义中C R是称为”宏名”的标识符#define C R 0455、#define ADD(x) x+xmain(){int m=1,n=2,k=3;int sum=ADD(m+n)*k;printf(“sum=%d”,sum);}上面程序的运行结果是()。

A)sum=9 B)sum=10 C)sum=12 D)sum=186、以下程序的运行结果是()。

#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)1507、在宏定义#define PI 3.14159中,用宏名PI代替一个()。

A)常量B)单精度数C)双精度数D)字符串8、以下程序的运行结果是()#include”stdio.h”#define FUDGE(y) 2.84+y#define PR(a) printf(“%d”,(int)(a))#define PRINT1(a) PR(a);put char(‘\n’)main(){int x=2;PRINT1(FUDGE(5)*x);}A)11 B)12 C)13 D)159、以下有关宏替换的叙述不正确的是()。

编程选择题40道:C语言预处理器:宏定义与条件编译.Tex

编程选择题40道:C语言预处理器:宏定义与条件编译.Tex

1.在C语言中,#define 用于定义宏,以下哪个是正确的宏定义使用?o A. #define PI 3.14o B. #define MAX(x, y) x > y ? x : yo C. #define HELLO worldo D. #define int long答案: B解析: 选项A定义了一个常量宏,但选项B定义了一个函数样式的宏,用于计算两个数中的最大值,是更复杂的宏定义示例。

2.以下哪个宏定义在编译期会被预处理器替换?o A. #define DEBUG(x) printf("调试信息: %d\n", x)o B. #define LARGE_NUMBER 1000000Lo C. #define IF ifo D. #define FOR for答案: B解析: 长整型字面量定义的宏在编译期会被数值替换,而选项A会替换为一个函数调用,选项C和D定义了新的关键字,不会在编译期被数值替换。

3.在C语言预处理指令中,#if 和 #ifdef 的主要区别是什么?o A. #if 用于处理表达式,而 #ifdef 用于检查宏是否定义。

o B. #ifdef 可以检查宏的值,而 #if 只能检查宏是否定义。

o C. #if 只能用于数字比较,而 #ifdef 可以用于字符串比较。

o D. #ifdef 和 #if 是完全一样的。

答案: A解析: #ifdef 只检查宏是否定义,不考虑宏的值,#if 可以处理表达式,包括宏的值。

4.当使用 #ifndef 和 #define 指令时,以下哪个说法是正确的?o A. 如果宏未定义,那么 #ifndef 后面的代码会被编译。

o B. #ifndef 后必须紧跟 #define。

o C. #ifndef 和 #define 可以在任何地方出现。

o D. #ifndef 检查宏定义的值。

答案: A解析: #ifndef 用于检查宏是否未定义,如果未定义,后面的代码将被编译。

c语言第8章-编译预处理及位运算习题答案doc资料

c语言第8章-编译预处理及位运算习题答案doc资料

c语言第8章-编译预处理及位运算习题答案编译预处理习题一.单项选择题1.在宏定义#define A 3.897678中,宏名A代替一个()。

A)单精度数 B)双精度数 C)常量 D)字符串2.以下叙述中正确的是A)预处理命令行必须位于源文件的开头 B)在源文件的一行上可以有多条预处理命令C)宏名必须用大写字母表示D)宏替换不占用程序的运行时间3.C语言的编译系统对宏命令的处理()。

A)在程序运行时进行的B)在程序连接时进行的C)和C程序中的其它语句同时进行的D)在对源程序中其它语句正式编译之前进行的4.在文件包含预处理语句的中,被包含文件名用“< >”括起时,寻找被包含文件的方式是()。

A)直接按系统设定的标准方式搜索目录B)先在源程序所在目录搜索,再按系统设定的标准方式搜索C)仅仅在源程序所在目录搜索D)仅仅搜索当前目录5.以下说法中正确的是A)#define和printf都是C语句 B)#define是C语句,而printf不是C)printf是C语句,但#define不是D)#define和printf都不是C 语句6.#define A 3.897678#include <stdio.h>main( ){ printf(“A=%f ”,A);}程序运行结果为()。

A) 3.897678=3.897678 B) 3.897678=A C) A=3.897678 D)无结果7.有宏定义:#define LI(a,b) a*b#define LJ(a,b) (a)*(b)在后面的程序中有宏引用:x=LI(3+2,5+8);y=LJ(3+2,5+8);则x、y的值是()。

A) x=65,y=65 B) x=21,y=65 C) x=65,y=21 D)x=21,y=218.有以下程序# define f(x) (x*x)main(){ int i1, i2;i1=f(8)/f(4) ; i2=f(4+4)/f(2+2) ;printf("%d, %d\n",i1,i2);}程序运行后的输出结果是A)64, 28 B)4, 4 C)4, 3D)64, 649.以下程序的输出结果是#define M(x,y,z) x*y+zmain(){ int a=1,b=2, c=3;printf(“%d\n”, M(a+b,b+c, c+a));}A) 19 B) 17 C) 15 D) 1210.有以下程序#define N 5#define M1 N*3#define M2 N*2main(){ int i;i=M1+M2; printf(“%d\n”,i);}程序编译后运行的输出结果是:A) 10 B) 20 C) 25 D) 3011.有如下程序#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) 6C) 7 D) 812.位运算是对运算对象按二进制位进行操作的运算,运算的对象是____数据,以___的形式参与运算。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

预处理命令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*Rmain(){printf("L=%f S=%f\n",L,S);}A. L=18.849556 S=28.274333B. 18.849556=18.849556 28.274333=28.274333C. L=18.849556 28.274333=28.274333D. 18.849556=18.849556 S=28.27433310.以下程序执行的输出结果是( )。

#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.15B.100C.10D.15011.下列程序执行后的输出结果是( )。

#define MA(x) x*(x-1)main(){int a=1,b=2;printf("%d \n",MA(1+a+b));}A. 6B. 8C. 10D. 1212.以下程序的输出结果是( )。

#define M(x,y,z) x*y+zmain(){int a=1,b=2, c=3;printf("%d\n", M(a+b,b+c, c+a));}A. 19B. 17C. 15D. 1213.程序中头文件typel.h 的内容是( )。

#define N 5#define M1 N*3程序如下:#include "type1.h"#define M2 N*2main(){int i;i=M1+M2;printf("%d\n",i);}程序编译后运行的输出结果是()。

A. 10B. 20C. 25D. 3014.请读程序:#include<stdio.h>#define SUB(X,Y) (X)*Ymain(){int a=3, b=4;printf("%d", SUB(a++, b++));}上面程序的输出结果是()。

A. 12B. 15C. 16D. 2015.执行下面的程序后,a的值是( )。

#define SQR(X) X*Xmain( ){int a=10,k=2,m=1;a/=SQR(k+m)/SQR(k+m);printf("%d\n",a);}A. 10B. 1C. 9D. 016.设有以下宏定义#define N 3#define Y(n) ((N+1)*n)则执行语句:z=2 * (N+Y(5+1));后,z的值为( )。

A.出错B. 42C. 48D. 5417.以下程序的输出结果是( )。

#define f(x) x*xmain( ){int a=6,b=2,c;c=f(a) / f(b);printf("%d\n",c);}A. 9B. 6C. 36D. 1818.有如下程序#define N 2#define M N+1#define NUM 2*M+1main(){int i;for(i=1;i<=NUM;i++)printf("%d\n",i);}该程序中的for循环执行的次数是( )。

A. 5B. 6C. 7D. 819.执行如下程序后,输出结果为()。

#include <stdio.h>#define N 4+1#define M N*2+N#define RE 5*M+M*Nmain(){printf("%d",RE/2);}A.150B.100C. 41D.以上结果都不正确20.以下程序的输出结果是()。

#define LETTER 0main(){char str[20]= "C Language",c;int i;i=0;while((c=str[i])!=’\0’){i++;#if LETTERif(c>=’a’&&c<=’z’) c=c-32;#elseif(c>=’A’&&c<=’Z’) c=c+32;#endifprintf("%c",c);}}A. C LanguageB. c languageC. C LANGUAGED. c LANGUAGE2 填空题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;printf("input a radus: ");scanf("%f",&r);CIRCLE(r,l,s,v);printf("r=%.2f\n l=%.2f\n s=%.2f\n v=%.2f\n", 【3】 );}3 答案及部分解析一.选择题答案1.A2.B3.B4.B5.D6.B7.D 8.D 9.A 10.A 11.B 12.D13.C 14.A 15.B 16.C 17.C 18.B19.C 20.B1. 解析:关于宏的习题,我们要牢记一点:宏展开只是简单的字符串替换。

宏名无类型,宏的参数也没有类型,所以选项A)是正确的。

宏展开是在正式编译以前进行的,不会占用程序的运行时间,而会占用编译时间,所以选项B)错误。

规定所有的编译预处理命令都不是C语言中的语句,因而,编译预处理命令不以分号作为结束符,所以选项C)错误。

头文件习惯上以“.h”为后缀,但它只是习惯而不是规定。

所以选项D)错误。

9. 解析:注意双引号中的宏名不被展开,所以输出结果为L=18.849556 S=28.274333,而不是18.849556=18.849556 28.274333=28.274333。

10.解析:宏展开就是简单的字符串替换。

语句k=10*MIN(i,j);经过宏展开为k=10*(i)<(j)?(i):(j);。

由于*号的优先级要高于<号的优先级,因此要先进行10*(i)的运算;把值带入宏展开式为k=10*10<15?10:15;,条件表达式的值为15。

所以选项A)是正确的。

20.解析:条件编译的命令总共有三种:一种是#ifdef 标识符…#else…#endif,作用是当标识符被定义过,就编译前一段程序,否则编译后一段程序;第二种是#ifdef 标识符…#else…#endif,作用是当标识符未被定义过,就编译前一段程序,否则编译后一段程序;第三种是#if 表达式…#else…#endif,作用是表达式的值为“真”时编译前一段程序,否则编译后一段程序。

相关文档
最新文档