[计算机类试卷]国家二级C语言(编译预处理和指针)机试模拟试卷10及答案与解析.doc

上传人:sumcourage256 文档编号:499038 上传时间:2018-11-30 格式:DOC 页数:17 大小:49KB
下载 相关 举报
[计算机类试卷]国家二级C语言(编译预处理和指针)机试模拟试卷10及答案与解析.doc_第1页
第1页 / 共17页
[计算机类试卷]国家二级C语言(编译预处理和指针)机试模拟试卷10及答案与解析.doc_第2页
第2页 / 共17页
[计算机类试卷]国家二级C语言(编译预处理和指针)机试模拟试卷10及答案与解析.doc_第3页
第3页 / 共17页
[计算机类试卷]国家二级C语言(编译预处理和指针)机试模拟试卷10及答案与解析.doc_第4页
第4页 / 共17页
[计算机类试卷]国家二级C语言(编译预处理和指针)机试模拟试卷10及答案与解析.doc_第5页
第5页 / 共17页
点击查看更多>>
资源描述

1、国家二级 C语言(编译预处理和指针)机试模拟试卷 10及答案与解析 一、选择题 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.1fn“ , S(a+b); 程序 运行后的输出结果是 ( A) 31.5 ( B) 7.5 ( C)程序有错无输出结果 ( D

2、) 14.0 3 以下关于宏的叙述中正确的是 ( A)宏定义必须位于源程序中所有语句之前 ( B)宏名必须用大写字母表示 ( C)宏调用比函数调用耗费时间 ( D)宏替换没有数据类型限制 4 有以下程序 #include stdio.h #define S(x) 4*(x)*x+1 void main() int k=5,j=2; printf(“%dn“,S(k+j); 程序运行后的输出结 果是 ( A) 197 ( B) 143 ( C) 33 ( D) 28 5 设有宏定义: #define IsDIV(k,n) ( ( k%n=1) ? 1 : 0) 且变量 m已正确定义并赋值,则宏调

3、用: IsDIV(m,5) d=SUB(a+b)*c; printf(“%dn“,d); 程序运行后的输出结果是 ( A) -12 ( B) 0 ( C) 10 ( D) -20 7 有以下程序 #include stdio.h #define f(x) x*x*x main() int a=3,s,t ; s=f(a+1); t=f(a+1); printf(“%d,%dn“,s,t); 程序运行后的输出结果是 ( A) 10,10 ( B) 10,64 ( C) 64,10 ( D) 64,64 8 有下列程序: #include stdio.h #define N 5 #define M

4、 N+1 #define f(x) (x*M) main( ) int i1,i2; i1=f(2); i2=f(1+1); printf(“%d %dn“, i1,i2); 程序的运行结果是 ( A) 12 7 ( B) 12 12 ( C) 11 11 ( D) 11 7 9 以下叙述中错误的是 ( A)预处理命令行的最后不能以分号表示结束 ( B) C程序对预处理命令行的处理是在程序执行的过程中进行的 ( C) #define MAX 是合法的宏定义命令行 ( D)在程序中凡是以 “#”开始的语句行都是预处理命令行 10 若程序中有宏定义行: #define N 100 则以下叙述中正确

5、的是 ( A)宏定义行中定义了标识符 N的值为整数 100 ( B)上述宏定义行实现将 100赋给标示符 N ( C)在运行时用 100替换标识符 N ( D)在编译程序对 C源程序进行预处理时用 100替换标识符 N 11 有以下程序 #include stdio.h #define N 2 #define M N+1 #define NUM (M+1) * M/2 main() printf(“%dn“,NUM ); 程序运行后的输出结果是 ( A) 4 ( B) 8 ( C) 9 ( D) 6 12 有以下程序 #include stdio.h #define SUB( X, Y ) (

6、X+1)*Y main() int a=3, b=4; printf(“%dn“, SUB(a+ ,b+ ); 程序运行后的输出结果是 ( A) 20 ( B) 12 ( C) 16 ( D) 25 13 下面选项中关于编译预处理的叙述正确的是 ( A)凡是以 #号开头的行,都被称为编译预处理命令行 ( B)预处理命令行必须使用分号结尾 ( C)预处理命令行不能出现在程序的最后一行 ( D)预处理命令行的作用域是到最近的函数结束处 14 有以下程序 #include stdio.h #define SQR(X) X*X main() int a=10, k=2, m=1; a /= SQR(k

7、+m)/SQR(k+m); printf(“%dn“,a); 程 序的输出结果是 ( A) 0 ( B) 1 ( C) 9 ( D) 10 15 若有以下程序 #define S(x) x*x #define T(x) S(x)*S(x) main() int k=5, j=2; printf(“%d,%dn“, S(k+j),T(k+j); 则程序的输出结果是 ( A) 17,37 ( B) 49,2401 ( C) 17,289 ( D) 49,289 16 以下叙述中正确的是 ( A)在包含文件中,不得再包含其他文件 ( B) #include命令行不能出现在程序 文件的中间 ( C)在

8、一个程序中,允许使用任意数量的 #include命令行 ( D)虽然包含文件被修改了,包含该文件的源程序也可以不重新进行编译和连接 17 有以下程序 #include stdio.h #include stdlib.h int fun(int n) int *p; p=(int*)malloc(sizeof(int); *p=n; return *p; main() int a; a = fun(10); printf(“%dn“, a+fun(10); 程序的运行结果是 ( A) 10 ( B) 20 ( C) 0 ( D)出错 18 有以下程序 #include stdio.h #incl

9、ude stdlib.h main() int *a,*b,*c; a=b=c=(int *)malloc(sizeof(int); *a=1; *b=2, *c=3; a=b; printf(“%d,%d,%dn“,*a,*b,*c); 程序运行后的输出结果是 ( A) 2,2,3 ( B) 3,3,3 ( C) 1,2,3 ( D) 1,1,3 19 有以下程序 void fun(int *p1,int *p2,int *s ) s=( int * )malloc( sizeof(int) ); *s = *p1 + *(p2+); main() int a2=1,2 , b2=10,20

10、, *s=a; fun( a,b,s ); printf(“%dn“, *s ); 程序运行后的输出结果是 ( A) 10 ( B) 11 ( C) 2 ( D) 1 20 有以下程序段 int *p; p= _ malloc( sizeof( int ); 若要求使 p指向一个int 型的动态存储单元,在横线处应填入的是 ( A) (int *) ( B) int ( C) int * ( D) ( *int ) 21 有以下程序 void fun( double *p1,double *p2,double *s) s = (double *)calloc( 1,sizeof(double)

11、 ); *s = *p1 + *( p2+1 ); main() double a2 = 1.1, 2.2 , b2 = 10.0, 20.0 , *s=a; fun( a, b, s ); printf( “%5.2fn“, *s); 程序的输出结果是 ( A) 1.10 ( B) 11.10 ( C) 12.10 ( D) 21.10 22 设有以下函数: void fun(int n,char *s) 则下面对函数指针的定义和赋值均正确的是 ( A) void *pf(); pf=fun; ( B) void (*pf)(int, char*); pf=fun; ( C) void *p

12、f(); *pf=fun; ( D) void (*pf)(int,char); pf= 23 设有定义语句 int (*f)(int); 则以下叙述正确的是 ( A) f是基类型为 int的指针变量 ( B) f是指向 int类型一维数组的指针变量 ( C) f是指向函数的指针变量,该函数具有一个 int类型的形参 ( D) f是函数名,该函数的返回值是基类型为 int类型的地址 24 以下叙述中正确的是 ( A)指针变量只能通过求地址运算符( 与 p=0;是等价的语句 ( C) int* p1; int * p2; int *p3;都是合法的定义指针变量的语句 ( D)语句 p=NULL;

13、执行后,指针 p指向地址为 0的存储单元 25 以下叙述中正确的是 ( A)函数的类型不能是指针类型 ( B)函数的形参类型不能是指针类型 ( C)基类型不同的指针变量可以相互混用 ( D)设有指针变量为 double *p,则 p+1 将指针 p移动 8个字节 26 设有某函数的说明为 int* func(int a10, int n); 则下列叙述 中,正确的是 ( A)说明中的 a10写成 a或 *a效果完全一样 ( B)形参 a对应的实参只能是数组名 ( C) func的函数体中不能对 a进行移动指针(如 a+)的操作 ( D)只有指向 10个整数内存单元的指针,才能作为实参传给 a

14、国家二级 C语言(编译预处理和指针)机试模拟试卷 10答案与解析 一、选择题 1 【正确答案】 D 【试题解析】 在 C语言中,凡是以 “#”号开头的行,都称为 “编译预处理 ”命令行。预处理命令可以放在程序中的任何位置,其有效范围是从定义开始到文件结束。预处理命令有宏定义 、文件包含和条件编译三类。 #include stdio.h命令行表示程序中要引用 C标准函数库中的标准输入输出函数。 【知识模块】 编译预处理和指针 2 【正确答案】 C 【试题解析】 本题考查宏定义。预处理语句后面不能加分号,因此程序有错。如果没加分号的话 S(a+b)=PT*a+b*a+ b=3.5*1+2*1+2=

15、7.5。 【知识模块】 编译预处理和指针 3 【正确答案】 D 【试题解析】 本题考查宏替换的规则。宏替换分为简单的字符替换和带参数的宏替换两类。使用宏时应注意以下几点: 宏定义仅仅是符号替换,不是赋值语句,因此不做语法检查; 为了区别程序中其他的标识符,宏名的定义通常用大写字母,但不是必须用大写; 双引号中出现的宏名不替换; 使用宏定义可以嵌套,即后定义的宏中可以使用先定义的宏。 【知识模块】 编译预处理和指针 4 【正确答案】 B 【试题解析】 这道题涉及到带参数的宏的定义和替换这个知识点。在程序中定义了带参数的宏 S( x),当在主函数中用参数 k+j调用宏 S时 ,根据宏替换的原则,则

16、 S( k+j) =S(5+2)=4*7*5+2+1=143。 【知识模块】 编译预处理和指针 5 【正确答案】 C 【试题解析】 本题考查宏定义和三目运算符。三目运算符的格式为: test ? 语句1 : 语句 2 其中, test可以是任何 Boolean 表达式。语句 1,当 test 是 true 时执行该语句,可以是复合语句;语句 2,当 test 是 false 时执行该语句,可以是复合语句。isDIV(k ,n)要表达的是当 k除 n的余数是 1时表达式的值为 1, 否则为 0,所以题中要表达的是 m被 5和 7整除是否都余 1。 【知识模块】 编译预处理和指针 6 【正确答案】

17、 D 【试题解析】 本题主要考查的是宏替换,在程序中执行 d=sub(a+b)*c这条语句时,首先要进行宏替换,依据宏 SUB(a)的定义可知,上面这条语句替换为d=(a+b)-(a+b)*c,因为乘法的优先级比减法的优先级高,所以先进行乘法运算,即 d=5-5*5=-20。 【知识模块】 编译预处理和指针 7 【正确答案】 B 【试题解析】 根据题目中宏 f(x)的定义, f(a+1)=a+1*a+1*a+1= a+a+a+1=10,而f(a+1)=(a+1)*(a+1)*(a+1)=4*4*4=64。 【知识模块】 编译预处理和指针 8 【正确答案】 D 【试题解析】 在本题中,定义了 3

18、个宏定义语句,分别是: #define N 5、 #define M N+5和 #define f(x) (x*M),所以根据 C语言的宏替换规则,我们可知,f(2)=2*N+1=2*5+1=11, f(1+1)=1+1*N+1=1+1*5+1=7。 【知识模块】 编译预处理和指针 9 【正确答案】 B 【试题解析】 预处理命令行是以 “#”开始的语句,预处理命令行的最后不能以分号表示结束,预处理命令行。其中宏定义的字符替换的定义格式为: # define 标识符 字符串,预处理命令行是在系统对源程序进行编译之前进行处理的,不是在程序执行的过程中。 【知识模块】 编译预处理和指针 10 【正确

19、答案】 D 【试题解析】 在 C语言中,凡是以 “#”号开头的行,都称为 “编译预处理 ”。其含义是在 C编译程序对 C源程序进行编译前,由编译预处理程序对这些编译预处理命令进行处理的过 程。由 #define定义的宏就是编译预处理命令。 C程序在进行编译之前,都要先对程序中所有出现的 “宏名 ”,都用宏定义中的替换文本进行替换。 【知识模块】 编译预处理和指针 11 【正确答案】 B 【试题解析】 宏展开以后 NUM为( 2+1+1) *2+1/2,计算以后值为 8。注意在进行宏展开的时候,千万不要试图计算,展开以后再进行计算。 【知识模块】 编译预处理和指针 12 【正确答案】 C 【试题

20、解析】 宏展开的结果 (a+1)*b+,后缀自加表达式参加运算,先用 a和 b的初值 得到表达式的值,进行计算,然后 a和 b在自加。因此计算结果为 16。 【知识模块】 编译预处理和指针 13 【正确答案】 A 【试题解析】 在 C语言中,凡是以 “#”号开头的行,都称为编译预处理命令行。这些预处理命令组成的预处理命令行必须在一行的开头以 “#”号开始,每行的末尾不能用 “;”号结束,以区别于 C语句、定义和说明语句。根据需要,命令行可以出现在程序的任何一行的开始部位,其作用一直持续到源文件的末尾。 【知识模块】 编译预处理和指针 14 【正确答案】 B 【试题解析】 SQR(k+m)宏展开

21、以后为 k+m*k+m,值为 5,表达式 a/= SQR(k+m)/SQR(k+m)为 a=a/(5+5),表达式值为 1。 【知识模块】 编译预处理和指针 15 【正确答案】 A 【试题解析】 本题考查了宏替换,宏替换就是简单的字符替换,不会进行语法错误检查也不会进行运算。 S(k+j)宏展开以后为 k+j*k+j,值为 17, T(k+j)宏展开以后为 k+j*k+j*k+j*k+j,值为 37。 【知识模块】 编译预处理和指针 16 【正确答案】 A 【试题解析】 #include文件包含命令,使用时应注意以下 5个规则: 包含文件的 #include命令行通常应书写在所用源程序文件的开

22、头,故有时也把包含文件称作 “头文件 ”。头文件名可以由用户指定,其后缀不一定用 “.h”。 包含文件中,一般包含有一些公用的 #define命令行、外部说明或对(库)函数的原型说明。 当包含文件修改后,对包含该文件的源程序必须重新进行编译连接。 在一个程序中,允许有任意多个 #include命令行。 在包含文件中还可以包含其他文件。 【知识模块】 编译预处理和指针 17 【正确答案】 A 【试题解析】 函数 fun(int n)的功能是在内存中每次动态的申请一个整型变量的存储空间,把整型变量 n的值存入这个存储空间中。所以当在主函数中执行输出语句时, a+fun(10)的值等于 20。 【知

23、识模块】 编译预处理和指针 18 【正确答案】 B 【试题解析】 a=b=c=(int *)malloc(sizeof(int);含义为申请了一个整型的存储空间,让指针 a,b,c分别指向它, *a=1; *b=2; *c=3;语句的含义为所申请的整型存储空间的内容, *c=3最后执行导致存 储空间的内容为 3。 a=b的含义让指针 a也指向指针 b所指向的存储空间, a,b,c都指向整型的存储空间,里边的内容为 3。 【知识模块】 编译预处理和指针 19 【正确答案】 D 【试题解析】 主函数中定义指针 s指向数组 a,调用 fun函数,首先是实参传给形参,因此 p1指向 a, p2指向 b

24、, s指向 a,即 *s的值为 1。流程到调用函数 fun执行,首先更改 s的指向为新分空间的首地址,表达式 *s = *p1 + *(p2+),取 p1指向数据位 1,加上 p2指向数据 10, p2后移,存放到 s指向的空间中 11.流程 结束,形参 s和 p1, p2撤销,存入 s指向空间的数据丢失,主函数输出 s指向数据仍然是 1。 【知识模块】 编译预处理和指针 20 【正确答案】 A 【试题解析】 ANSIC标准规定 malloc函数返回值的类型为 void*。使用形式为: malloc(size),其中 size的类型为 unsigned int。 malloc函数用来分配 si

25、ze个字节的存储区,返回一个指向存储区首地址的基类型为 void的地址。若没有足够的内存单元供分配,函数返回空( NULL)。可以通过强制类型转换将返回值转换为需要类型的 地址。 【知识模块】 编译预处理和指针 21 【正确答案】 A 【试题解析】 ANSIC标准规定 calloc函数返回值的类型为 void*。具体使用格式为: calloc(n,size)。 该函数用来给 n个同一类型的数据项分配连续的存储空间,每个数据项的长度为size个字节。若分配成功,函数返回存储空间的首地址;否则返回空。通过调用calloc函数所分配的存储单元,系统自动置初值 0。 主函数中定义数组 a, b,以及指

26、针 s指向数组 a,调用 fun函数,实参 a和 b,以及 s的值传递给相对应形参 p1, p2, 以及 s,在 fun函数中更改 s的指向,以及指向的数据,但是函数调用结束以后,形参空间撤销,这项 【知识模块】 编译预处理和指针 22 【正确答案】 A 【试题解析】 函数指针的定义形式是:数据类型标识符 (*指针变量名 )();void(*pf)()定义了一个没有返回值的函数指针 pf,在给函数指针变量赋值时,只需给出函数名而不必给出参数。所以给 pf给赋值时,把函数名 fun赋给 pf即可。 【知识模块】 编译预处理和指针 23 【正确答案】 C 【试题解析】 定义语句 int (*f)(

27、int)中 f是指向函数的指针变量,该函数中也只有一个 int型的形参。 【知识模块】 编译预处理和指针 24 【正确答案】 C 【试题解析】 指针变量定义形式为: 类型 *指针变量名; 其中 *号的个数决定了几级指针,指针变量赋地址值的方式有 3种方式: 通过求地址运算符( 赋值语句,称 p为空指针。这条语 句等价于p=0;或 p=0; 这时,指针 p并不是指向地址为 0的存储单元,而是具有一个确定的值 -“空 ”。 【知识模块】 编译预处理和指针 25 【正确答案】 D 【试题解析】 在对指针进行加、减算术运算时,数字 1表示 1个存储单元的长度,而 double类型数据在内存中占 8个字节,因此移动一次移动 8个字节。其他三个都不正确。 【知识模块】 编译预处理和指针 26 【正确答案】 A 【试题解析】 函数 func为返回值为指针的函数,有两个形参,形参数组 a为指针变量,保存实参数组的 首地址,其元素个数由实参数组决定,因此说明中的a10写成 a或 *a效果完全一样。 【知识模块】 编译预处理和指针

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试资料 > 职业资格

copyright@ 2008-2019 麦多课文库(www.mydoc123.com)网站版权所有
备案/许可证编号:苏ICP备17064731号-1