国家二级C语言(编译预处理和指针)机试模拟试卷10
选择题
1.以下叙述中正确的是(D)
A. 在C语言中,预处理命令行都以\\
B. 预处理命令行必须位于C源程序的起始位置
C. #include 必须放在C程序的开头
D. C语言的预处理不能实现宏定义和条件编译的功能
解析:在C语言中,凡是以“#”号开头的行,都称为“编译预处理”命令行。预处理命令可以放在程序中的任何位置,其有效范围是从定义开始到文件结束。预处理命令有宏定义、文件包含和条件编译三类。#include <stdio.h>命令行表示程序中要引用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 <stdio.h>
#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+j)=S(5+2)=4*7*5+2+1=143。
5.设有宏定义: #define IsDIV(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 <stdio.h>
#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 <stdio.h>
#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)的定义,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.有下列程序:
#include <stdio.h>
#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个宏定义语句,分别是:#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)
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源程序进行编译前,由编译预处理程序对这些编译预处理命令进行处理的过程。由#define定义的宏就是编译预处理命令。C程序在进行编译之前,都要先对程序中所有出现的“宏名”,都用宏定义中的替换文本进行替换。
11.有以下程序
#include<stdio.h>
#define N 2
#define M N+1
#define NUM (M+1) * M/2
main() { printf(\\(B)
A. 4
B. 8
C. 9
D. 6
解析:宏展开以后NUM为(2+1+1)*2+1/2,计算以后值为8。注意在进行宏展开的时候,千万不要试图计算,展开以后再进行计算。
本文档预览:3600字符,共9105字符,源文件无水印,下载后包含无答案版和有答案版,查看完整word版点下载