1、国家二级 C语言机试(选择题)模拟试卷 66及答案与解析 一、选择题 1 以下叙述中正确的是 ( )。 ( A)在 C语言中,预处理命令行都以 “#”开头 ( B)预处理命令行必须位于 C源程序的起始位置 ( C) #include必须放在 C程序的开头 ( D) C语言的预处理不能实现宏定义和条件编译的功能 2 以下关于宏的叙述中正确的是 ( )。 ( A)宏替换没有数据类型限制 ( B)宏定义必须位于源程序中所有语句之前 ( C)宏名必须用大写字母表示 ( D)宏调用比函数调 用耗费时间 3 有以下程序: #include #define PT 3 5; #define S(x)PT*x*
2、x; main( ) int a=1, b=2; printf(“ 4 1f n“, S(a+b); 程序运行后的输出结果是 ( )。 ( A) 7 5 ( B) 31 5 ( C)程序有错无输出结果 ( D) 14 0 4 若程序中有宏定义行: define N 100 更哼以下叙述中正确的 是 ( )。 ( A)宏定义行中定义了标识符 N的值为整数 100 ( B)在编译程序对 C源程序进行预处理时用 100替换标识符 N ( C)上述宏定义行实现将 100赋给标识符 N ( D)在运行时用 100替换标识符 N 5 有以下程序: #include #define S(x)4*(x)*x+
3、1 main( ) int k=5, j=2; printf(“ d n“, S(k+j); 程序运行后的输出结果是 ( )。 ( A) 33 ( B) 197 ( C) 143 ( D) 28 6 有以下程序: #include #define SUB(a)(a)-(a) main( ) int a=2, b=3, c=5, d; d=SUB(a+b)*c; printf(“ d n“, d); 程序运行后的输出结果是 ( )。 ( A) 0 ( B) -12 ( C) -20 ( D) 10 7 有以下程序: #include #define f(x)x*x*x main( ) int a
4、=3, s, t; s=f(a+1); t=f(a+1); printf(“ d, d n“, s, t); 程序运行后的输出结果是 ( )。 ( A) 10, 64 ( B) 10, 10 ( C) 64, 10 ( D) 64, 64 8 有以下程序: #include define N 5 #deftne 1 N+l #define f(x) (x*M) main( ) int il, i2; il=f(2); i2=f(1+1); printf(“ d d n“, i1, i2); 程序的运行结果是 ( )。 ( A) 12 7 ( B) 12 12 ( C) 11 11 ( D) 1
5、l 7 9 若有以下程序: #include #define 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) 17, 289 ( B) 49, 2401 ( C) 17, 37 ( D) 49, 289 10 若有以下程序: include #define S(x) (x)*(x) #define T(x)S(x) S(x)+1 main( ) int k=3 j=2; printf(“ d, d n“, S(k+j), T(k
6、+j); 则程序的输出结果是 ( )。 ( A) 11, 2 ( B) 25, 2 ( C) 11, 12 ( D) 25, 26 11 有以下程序: #include #define N 2 #define M N+1 #define NUM (M 4-1)*M 2 main( ) printf(“ d n“, NUM); 程序运行后的输出结果是 ( )。 ( A) 4 ( B) 8 ( C) 9 ( D) 6 12 有以下程序: #include #define SUB(X, Y) (X+1)*Y main( ) int a=3, b=4; printf(“ d n“, SUB(a+, b
7、+); 程序运行后的输出结果是 ( )。 ( A) 25 ( B) 20 ( C) 12 ( D) 16 13 以下叙述中错误的是 ( )。 ( A) C程序对预处理命令行的处理是在程序执行过程中进行的 ( B)预处理命令行的最后不能以分号表示结束 ( C) #define MAX是合法的宏定义命令行 ( D)在程序中凡是以 “#”开始的语句行都是预处理命令行 14 下面选项中关于编译预处理的叙述正确的是 ( )。 ( A)预处理命令行必须使用分号结尾 ( B)凡是以 #号开头的行,都被称为编译预处理命令行 ( C)预处理命令行不能出现在程序的最后一行 ( D)预处理命令行的作用域是到最近的函
8、数结束处 15 有以下程序段: int *p; p=_malloc(sizeof(int); 若要求使 p指向一个 int型的动态存储单元,在横线处应填人的是 ( )。 ( A) (int*) ( B) int ( C) int * ( D) (*int) 国家二级 C语言机试(选择题)模拟试卷 66答案与解析 一、选择题 1 【正确答案】 A 【试题解析】 预处理命令是以 “#”号开头的命令,它们不是 C语言的可执行命令,这些命令应该在函数之外书写。一般在源文件的最前面书写,但不是必须在起始位置书写,所以 B、 C错误。 C语言 的预处理能够实现宏定义和条件编译等功能,所以 D错误。 2 【
9、正确答案】 A 【试题解析】 宏定义写在函数的花括号外面,作用域为其后的程序,通常在文件的最开头,所以 B选项中的 “宏定义必须位于源程序中所有语句之前 ”是错误的。宏名一般用大写,但不是必须用大写,所以 C选项错误。宏展开不占运行时间,只占编译时间,函数调用占运行时间 (分配内存、保留现场、值传递、返回值 ),所以 D选项错误。 3 【正确答案】 C 【试题解析】 宏定义不是 c语句,末尾不需要分号。所以语句 “printf(“ 4 1f、n“, S(a+b); ”展开后为 “printf(“ 4 1f n“, 3 5; *a+b*a+b; ); ”所以程序会出现语法错误。 4 【正确答案】
10、 B 【试题解析】 本题考查预编译相关知识。宏定义在编译程序时做了一个简单的替换,所以选项 B正确。 5 【正确答案】 C 【试题解析】 本题考查带参数的宏定义。 s为带参数的宏定义,运行 S(k+j)为4*(k+j)*k+j+1=143,故选项 C正确。 6 【正确答案】 C 【试题解析】 本题考查宏定义。宏定义只是做简单的替换,所以本题中执行语句SUB(a+b)c=(a+b-(a+b)*c=-20,故答案为 C选项。 7 【正确答案】 A 【试题解析】 本题考查宏定义。宏定义只是做个简单的替换,所以本题中执行语句 f(a+1)=a+la+1a+l=3*a+1=10, f(a+1)=(a+1
11、)*(a+1)*(a+1)=64,所以答案为 A选项。 8 【正确答案】 D 【试题解析】 本题考查宏定义。宏定义只是做简单的替换,所以本题中执行语句f(2)=(2*N+1)=ll,执行语句 f(1+1)=(1+1*N+1)=7。因此选项 D正确 。 9 【正确答案】 C 【试题解析】 本题考查宏定义。宏定义只是做简单的替换,执行语句S(k+j)=k+j*k+j=17, T(k+j)=S(k+j)*S(k+j)=k+j*k+j*k+j*k+j=37,因此选项 C正确。 10 【正确答案】 D 【试题解析】 本题考查宏定义。宏定义只是做简单的替换,执行语句s(k+j)=(k+j)*(k+j)=2
12、5, T(k+j)=S(k+j) S(k+j)+1=(k+j)*(k+j) (k+j)*(k+j)+1=26,因此选项 D正确。 11 【正确答 案】 B 【试题解析】 本题考查宏定义。宏定义只是做简单的替换,执行语句NUM=(N+1+1)*N+1 2=8,故选项 B正确。 12 【正确答案】 D 【试题解析】 本题考查宏定义。宏定义只是做简单的替换, +运算符是先使用后自增 l,所以语句 SUB(a+, b+)=(a+ +1)*b+(a+1)木 b+=(3+1)*4=16,选项 D正确。 13 【正确答案】 A 【试题解析】 本题考查预处理命令行。预处理是在程序编译之前进行的,所以 A选项错误。 14 【正确答案】 B 【试题解析】 本题考查预处理命令行。预处理命令行不能以分号结尾,所以 A选项错误。预处理命令行可以出现在程序的最后一行,预处理命令行作用域是整个文件,所以 C、 D选项错误。 15 【正确答案】 A 【试题解析】 本题考查 malloc函数的用法。题目中要求 p指向一个 int型的动态存储单元,那么就应该将分配的存储单元转化为 int型,所以选项 A正确。