国家二级C语言机试(翻译预处理和指针)模拟试卷12
选择题
1.以下程序的输出结果是( )。
#define PT 3.5;
#define S(x)PT*x*x;
main(){int a=1,b=2;
printf(’’%4.1f\n’’,S(a+b));}(C)
A. 14.0
B. 7.5
C. 程序有错无输出结果
D. 31.5
解析:C语言规定预处理语句后面不能加分号,因此程序有错。如果没加分号的话S(a+b)=PT*a+b*a+b=3.5*1+2*1+2=7.5。
2.以下程序的输出结果是( )。
#include
#define S(x)4*(x)*x+1
void main()
{int k=5,j=2;
printf(’’’’%d\n’’,S(k+j));
}(B)
A. 33
B. 143
C. 28
D. 197
解析:本题考查带参数的宏的定义和替换点。在程序中定义了带参数的宏S(x),当在主函数中用参数k+i调用宏S时,根据宏替换的原则,则S(k+j)=S(5+2)=4*7*5+2+1=143。
3.以下程序的输出结果是( )。
#include
#define SUB(A)(A)-(A)
main(){int a=2,b=3,c=5,d;
d=SUB(a+b)*c;
printf(’’%d\n’’,d);}(D)
A. 0
B. 10
C. 一12
D. 一20
解析:本题主要考查的是宏替换,在程序中执行d=SUB(a+b)*c这条语句时,首先要进行宏替换,依据宏SUB(A)的定义可知,上面这条语句替换为d=(a+b)一(a+b)*c,因为乘法的优先级比减法的优先级高,所以先进行乘法运算,即d=5—5*5=一20,可以看出,出现了运算错误。
4.以下程序的输出结果是( )。
#include
#define N 5
#define M N+1
#define f(x)(x*M)
main()
{int i1,i2;
il=f(2);
i2=f(1+1);
printf(’’%d%d\n’’,il,i2);}(D)
A. 12 12
B. 12 7
C. 12 11
D. 11 7
解析:本题考查了宏的嵌套定义定义了3个宏定义语句,分别是:#defineN 5、#defineM N+1和#definef(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。
5.关于#define N 100的叙述中正确的是( )。(D)
A. 宏定义行中定义了标识符N的值为整数100
B. 上述宏定义行实现将100赋给标识符N
C. 在运行时用100替换标识符N
D. 在编译程序对C源程序进行预处理时用100替换标识符N
解析:在C语言中,凡是以“#”开头的行,都称为“翻译预处理”。其含义是在C编译程序对C源程序进行编译前,由编译预处理程序对这些编译预处理命令进行处理的过程,即在程序执行之前就处理了。由#define定义的宏就是编译预处理命令。C程序在进行编译之前,都要先对程序中所有出现的“宏名”。都用宏定义中的替换文本进行替换。
6.以下程序的输出结果是( )。
#include
#define N 2
#define M N+1
#define NUM(M+1)*M/2
main(){printf(’’%d\n’’,NUM);}(B)
A. 9
B. 8
C. 7
D. 6
解析:本题考查宏替换。宏展开以后NUM为(2+1+1)*2+1/2,计算以后值为8。在进行宏展开的时候,要展开以后再进行计算。
7.以下程序的输出结果是( )。
#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));
} }(B)
A. 21
B. 20
C. 10
D. 11
解析:本题考查内存申请。函数fun(int n)的功能是在内存中每次动态地申请一个整型变量的存储空间,把整型变量n的值存入这个存储空间中。所以当在主函数中执行输出语句时,a+fun(10)的值等于20。
8.关于int(*f)(int);的叙述中正确的是( )。(C)
A. f是基类型为int的指针变量
B. f是指向int类型一维数组的指针变量
C. f是指向函数的指针变量,该函数具有一个int类型的形参
D. f是函数名,该函数的返回值是基类型为int类型的地址
解析:题目中定义语句int(*f)(int)中f是指向函数的指针变量,该函数中也只有一个int型的形参。
9.关于函数参数的叙述中正确的是( )。(D)
A. 函数的形参类型不能是指针类型
B. 函数的类型不能是指针类型
C. 基类型不同的指针变量可以相互混用
D. 设有指针变量为“double *p”,则“p+1”将指针p移动8个字节
解析:C语言中在对指针进行加、减算术运算时,数字1表示1个存储单元的长度,而double类型数据在内存中占8个字节,因此移动一次移动8个字节。其他三个都不正确。
10.设int x=0,*p;下列赋值语句正确的是( )。(B)
A. *p=x;
B. p=NULL;
C. p=x;
D. *p=NULL;
解析:定义指针变量时,必须将指针变量初始化为NULL(为空),否则,如果不赋给它地址,系统会随机给它分配一个地址.以致出现错误的运算结果。
11.22.设float x;则以下对指针变量P进行定义且赋初值的语句中正确的是( )。(B)
A. float *p=1;
B. float *p=&x;
C. float p=&x;
D. int *p=(float)x;
解析:C语言中定义指针变量的一般形式为类型名木指针变量名1,*指针变量名2,……因而在选项B的表达式中,赋值号的左边表示定义了指针变量p,而右边表示求变量x的地址值。
12.没有编译错误的程序段是( )。(A)
A. char*sp,s[10];sp=’’Hello’’;
B. char*sp:s[10];s=’’Hello’’;
C. char strl[10]=’’computer’’,str2[10];str2=str1:
D. char mark[];mark=’’PROGRAM’’;
解析:本题考查了赋值表达式。选项B中数组名为
本文档预览:3600字符,共8360字符,源文件无水印,下载后包含无答案版和有答案版,查看完整word版点下载