国家二级C语言机试(翻译预处理和指针)模拟试卷11
选择题
1.关于C语言预处理命令的叙述中正确的是( )。(A)
A. 在C语言中,预处理命令行都以“#”开头
B. 预处理命令行必须位于C源程序的起始位置
C. #include必须放在C程序的起始位置
D. C语言的预处理不能实现宏定义和条件编译的功能
解析:C语言规定,凡是以“#”开头的行,都称为“编译预处理”命令行。预处理命令可以放在程序中的任何位置。其有效范围是从定义开始到文件结束。预处理命令有宏定义、文件包含和条件编译三类。#include命令行表示程序中要引用C标准函数库中的标准输入输出函数。
2.关于宏的叙述中正确的是( )。(D)
A. 宏名称必须用大写字母表示
B. 宏定义必须位于源程序中所有语句之前
C. 宏调用比函数调用耗费时间
D. 宏替换没有数据类型限制
解析:本题考查宏替换的规则。使用宏时应注意几点:①宏定义仅仅是符号替换,不是赋值语句,因此不做语法检查;②为了区别程序中其他的标识符,宏名的定义通常用大写字母,但不是必须用大写;③双引号中出现的宏名不替换;④使用宏定义可以嵌套,即后定义的宏中可以使用先定义的宏。
3.设#define IsDIV(k,n)((k%n==1)?1:0),则宏调用:IsDIV(m,5)&&IsDIV(m,7)为真时所要表达的是( )。(C)
A. 判断m是否能被5和7同时整除
B. 判断m被5或者7整除是否余1
C. 判断m被5和7整除是否都余
D. 判断m是否能被5或者7整除
解析:本题考查宏定义和三目运算符。三目运算符:test?语句1:语句2;其中,test可以是任何表达式。语句1,当test是非零时执行该语句,可以是复合语句;语句2,当test是零时执行该语句,可以是复合语句。IsDIV(k,n)要表达的是当k除n的余数是1时表达式的值为1,否则为0,所以题中要表达的是m被5和7整除是否都余1。
4.以下程序的输出结果是( )。
#include
#define f(x)x*x*x
main(){int a=3,s,t;
s=f(a+1);
t=f((a+1));
printf(’’%d,%d\n’’,s,t);} (B)
A. 64,10
B. 10,64
C. 10,10
D. 64,64
解析:根据题中宏f(x)的定义,运算过程应为:s=f(a+1)=a+1*a+1*a+1=a+a+a+1=10,因此最后s的结果为10,而f((a+1))=(a+1)*(a+1)*(a+1)=4*4*4=64的结果为64。
5.关于预处理命令的叙述中错误的是( )。(B)
A. 预处理命令行的最后不能以分号表示结束
B. C程序对预处理命令行的处理是在程序执行的过程中进行的
C. #define MAX是合法的宏定义命令行
D. 在程序中凡是以“#”开始的语句行都是预处理命令行
解析:C语言中预处理命令行是以“#”开始的语句,预处理命令行的最后不能以分号表示结束。其中宏定义的字符替换的定义格式为:#define标识符字符串,预处理命令行是在系统对源程序进行编译之前进行处理的,不是在程序执行的过程中。
6.以下程序的输出结果是( )。
#deftne S(x)x*x
#define T(x)S(x)*S(x)
main(){int k=5,j=2;
printf(’’%d,%d\n’’,S(k+j),T(k+j));}(A)
A. 17,37
B. 49,289
C. 17,289
D. 49,2401
解析:本题考查了宏替换,C语言中的宏替换不会进行语法错误检查也不会进行运算。“S(k+i)”宏展开以后为“k+j*k+j”,值为17,“T(k+j)”宏展开以后为“k+j*k+j*k+j*k+j”值为37。
7.关于#include的叙述中正确的是( )。(C)
A. 在包含文件中,不得再包含其他文件
B. #include命令行不能出现在程序文件的中间
C. 在一个程序中,允许使用任意数量的#include命令行
D. 虽然包含文件被修改了。包含该文件的源程序也可以不重新进行编译和连接
解析:C语言的预编译处理符号include具有以下规则:
①包含文件的include命令行通常应书写在所用源程序文件的开头,故有时也把包含文件称作“头文件”。头文件名可以由用户指定,其后缀不一定用“.h”;
②包含文件中,一般包含有一些公用的#define命令行、外部说明或对(库)函数的原型说明;
③当包含文件修改后,对包含该文件的源程序必须重新进行编译链接;
④在一个程序中,允许有任意多个#include命令行;
⑤在包含文件中还可以包含其他文件。
8.设void fun(int n,char *s){……},则下面对函数指针的定义和赋值均正确的是( )。(B)
A. void *pf();*pf=fun;
B. void (*pf)(int,char*);pf=fun;
C. void *pf();pf=fun;
D. void (*pf)(int,char);pf=&fun;
解析:void(*pf)()定义了一个没有返回值的函数指针pf,在给函数指针变量赋值时,只需给出函数名而不必给出参数。所以给pf赋值时,把函数名fun赋给pf即可。
9.关于变量和地址的叙述中正确的是( )。(C)
A. 语句p=NULL;执行后,指针P指向地址为0的存储单元
B. 语句’’p=NULL;’’与’’p=\0;’’是等价的语句
C. “int*p1;int**p2;int*p3;”都是合法的定义指针变量的语句
D. 指针变量只能通过求地址运算符(&)来获得地址值
解析:C语言规定指针变量赋地址值的方式有3种方式:①通过求地址运算符(&)获得地址值;②通过指针变量获得地址值;③通过标准函数获得地址值。另外NULL是在stdio.h头文件中定义的预定义符。NULL的代码值为0。可以给指针变量赋NULL值。例如p=NULL;赋值语句,称p为空指针。这条语句等价于p=’/0’;或p=0;这时,指针p并不是指向地址为0的存储单元,而是具有一个确定的值——“空”。
10.关于int* func(int a[10],int n);的叙述中正确的是( )。(A)
A. 说明中的a[10]写成a[]或*a效果完全一样
B. 形参a对应的实参只能是数组名
C. func的函数体中不能对a进行移动指针(如a++)的操作
D. 只有指向10个整数内存单元的指针,才能作为实参传给a
解析:函数func为返回值为指针的函数,有两个形参,形参数组a为指针变量,保存实参数组的首地址,其元素个数由实参数组决定,因此说明中的a[10]可以写成a[]或*a。
11.关于地址的叙述中错误的是( )。(D)
A. 改变函数形参的值,不会改变对应实参的值
B. 函数可以返回地址值
C. 当在程序的开头包含头文件stdio.h时,可以给指针变量赋:NULL
D. 可以给指针变量赋一个整数作为地址值
解析:C语言中指针变量的值只能是存储单元地址,
本文档预览:3600字符,共9027字符,源文件无水印,下载后包含无答案版和有答案版,查看完整word版点下载