国家二级C语言机试(编译预处理和指针)模拟试卷11
选择题
1.以下叙述中正确的是(A)
A. 在C语言中,预处理命令行都以\\
B. 预处理命令行必须位于C源程序的起始位置
C. #include必须放在C程序的开头
D. C语言的预处理不能实现宏定义和条件编译的功能
解析:在C语言中,凡是以“#”号开头的行,都称为“编译预处理”命令行。预处理命令可以放在程序中的任何位置,其有效范围是从定义开始到文件结束。预处理命令有宏定义、文件包含和条件编译三类。#include命令行表示程序中要引用C标准函数库中的标准输入输出函数。
2.有以下程序,程序运行后的输出结果是
#define PT 3.5;
#define S(x)PT*x*x;
main(){int a=1,b=2;
printf(\\(C)
A. 31.5
B. 7.5
C. 程序有错无输出结果
D. 14.0
解析:本题考查宏定义。预处理语句后面不能加分号,因此程序有错。如果没加分号的话S(a+b)=PT*a+b*a+b=3.5*1+2*1+2=7.5。
3.以下关于宏的叙述中正确的是(D)
A. 宏定义必须位于源程序中所有语句之前
B. 宏名必须用大写字母表示
C. 宏调用比函数调用耗费时间
D. 宏替换没有数据类型限制
解析:本题考查宏替换的规则。宏替换分为简单的字符替换和带参数的宏替换两类。使用宏时应注意几点:①宏定义仅仅是符号替换,不是赋值语句,因此不做语法检查;②为了区别程序中其他的标识符,宏名的定义通常用大写字母,但不是必须用大写;③双引号中出现的宏名不替换;④使用宏定义可以嵌套,即后定义的宏中可以使用先定义的宏。
4.有以下程序,程序运行后的输出结果是
#include
#define S(x)4*(x)*x+1
void main()
{int k=5,j=2;
printf(\\(B)
A. 197
B. 143
C. 33
D. 28
解析:这道题涉及到带参数的宏的定义和替换这个知识点。在程序中定义了带参数的宏S(x),当在主函数中用参数k+j调用宏S时,根据宏替换的原则,则S(k+i)=S(5+2)=4*7*5+2+1=143。
5.设有宏定义: #define lsDIV(k,n)((k%n==1)?1:0)且变量m已正确定义并赋值,则宏调用: IsDIV(m,5)&&IsDIV(m,7)为真时所要表达的是(C)
A. 判断m是否能被5和7整除
B. 判断m被5或者7整除足否余1
C. 判断m被5和7整除是否都余1
D. 判断m是否能被5或者7整除
解析:本题考查宏定义和三目运算符。三目运算符的格式为:test? 语句1:语句2
其中,test可以是任何Boolean表达式。语句1,当test是true时执行该语句,可以是复合语句;语句2,当test是false时执行该语句,可以是复合语句。isDIV(k,n)要表达的是当k除n的余数是1时表达式的值为1,否则为0,所以题中要表达的是m被5和7整除是否都余1。
6.有以下程序,程序运行后的输出结果是
#include
#define SUB(a)(a)-(a)
main(){ int a=2,b=3,c=5,d;
d=SUB(a+b)*c:
printf(\\(D)
A. -12
B. 0
C. 10
D. -20
解析:本题主要考查的是宏替换,在程序中执行d=sub(a+b)*c这条语句时,首先要进行宏替换,依据宏SUB(a)的定义可知,上面这条语句替换为d=(a+b)-(a+b)*c,因为乘法的优先级比减法的优先级高,所以先进行乘法运算,即d=5-5*5=-20。
7.有以下程序,程序运行后的输出结果是
#include
#define f(x)x*x*x
main(){int a=3,s,t;
s=f(a+1);
t=f((a+1));
printf(\\(B)
A. 10,10
B. 10,64
C. 64,10
D. 64,64
解析:根据题目中宏f(x)的定义,运算过程应为:s=f(a+1)=a+1*a+1*a+1=a+a+a+1=10,因此最后s的结果为10,而t=f((a+1))=(a+1)*(a+1)*(a+1)=4*4*4=64的结果为64。
8.有下列程序,程序的运行结果是
#include
#define N 5
#define M N+1
#define f(x)(x*M)
main()
{int i1,i2;
i1=f(2);
i2=f(1+1);
printf(\\(D)
A. 12 7
B. 12 12
C. 11 11
D. 11 7
解析:在本题中,定义了3个宏定义语句,分别是:#defne N 5、#define M N+5和#define fix)(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)
A. 预处理命令行的最后不能以分号表示结束
B. C程序对预处理命令行的处理是在程序执行的过程中进行的
C. #define MAX是合法的宏定义命令行
D. 在程序中凡是以“#”开始的语句行都是预处理命令行
解析:预处理命令行是以“#”开始的语句,预处理命令行的最后不能以分号表示结束,预处理命令行。其中宏定义的字符替换的定义格式为:#define标识符字符串,预处理命令行是在系统对源程序进行编译之前进行处理的,不是在程序执行的过程中。
10.若程序中有宏定义行: #define N 100则以下叙述中正确的是(D)
A. 宏定义行中定义了标识符N的值为整数100
B. 上述宏定义行实现将100赋给标示符N
C. 在运行时用100替换标识符N
D. 在编译程序对C源程序进行预处理时用100替换标识符N
解析:在C语言中,凡是以“#”号开头的行,都称为“编译预处理”。其含义是在C编译程序对C源程序进行编译前,由编译预处理程序对这些编译预处理命令进行处理的过程。Eh#define定义的宏就是编译预处理命令。C程序在进行编译之前,都要先对程序中所有出现的“宏名”,都用宏定义中的替换文本进行替换。
11.若有以下程序,则程序的输出结果是
#define Sfx)x*x
#define T(x)S(x)*S(x)
main(){int k=5,j=2;
printf(\\(A)
A. 17,37
B. 49,2401
<本文档预览:3600字符,共9116字符,源文件无水印,下载后包含无答案版和有答案版,查看完整word版点下载