8.1 选择题
(695) 根据编码规范,下面说法正确的是______。
a. 可以使用类型定义符typedef重命名用户类型;
b. typedef char NAME[20]; 是正确的定义;
c. 可以用宏定义来代替typedef的功能;
d. typedef是在预编译时完成的。
(a)
(696) 下面关于宏定义的说法正确的是:
a. 虽然预处理程序可以用#include指令包含任意一个文件,但最好不要用#include指令包含类型名不是".h"的文件,因为这样不容易区分哪些文件是用于编译预处理的;
b. 宏表达式及其参数应该使用括号括起来以避免二义性;
c. 尽量避免直接在代码中使用数字,应使用有意义的宏定义名字;
d. 宏所定义的多条表达式应放在大括号内。
(a.b.c.d)
(697) 下面宏定义符合规范的是_____
a. #define REC_AREA(a, b) a * b;
b. #define REC_AREA(a, b) (a * b);
c. #define REC_AREA(a, b) (a) * (b);
d. #define REC_AREA(a, b) ((a) * (b))
(d)
(698) 以下叙述正确的是____。
a. 根据编码规范,在程序的-行上可以出现多个有效的预处理命令行
b. 使用带参的宏时,参数的类型应与宏定义时的一致
c. 宏替换不占用运行时间,只占编译时间
d. 在以下定义中C R是称为"宏名"的标识符
#define C R 045
(c)
(699) 阅读下面程序:
#define LETTER 0
main()
{
char str[20]="MultiMedia",c;
int I;
I=0;
While((c=str[I])!='\0')
{I++;
#if LETTER
if(c>='a'&&c<='z')
c=c-32;
#else
if(c>='A'&&c<='Z')
c=c+32;
#endif
printf("%c",c);
}
}
上面程序的运行结果是:
a. MultiMedia
b. multimedia
c. MULTIMEDIA
d. mULTImEDIA
(b)
(700) c语言提供的预处理功能包括条件编译,其定义形式为:
#XXX 标示符
程序段1
#else
程序段2
#endif
这里XXX可以是:
a. define 或include
b. ifdef或include
c. ifdef或ifndef或define
d. ifdef或ifndef或if
(d)
(701) 以下正确的描述是____。
a. c语言的预处理功能是指完成宏替换和包含文件的调用
b. 预处理指令只能位于c源程序文件的首部
c. 凡是c源程序中行首以"#"标识的控制行都是预处理指令
d. C语言的编译预处理就是对源程序进行初步的语法检查
(a.c.d)
(702) 下面关于条件编译的说法不正确的是______。
a. #if 常量表达式
检查常量表达式计算值是否为非0;
b. #ifdef标识符
检查标识符当前是否预定义过;
c. #undef 标识符
如果标识符以前定义过, 那么 #undef 后, 标识符就被编译器认为是未定义的了;
d. #ifndef 表达式
检查表达式当前是否没有定义过。
(d)
(703) 下面宏定义有可能引发错误的是______(已知PI是圆周率的宏常量)。
a. #define s(r) PI*(r)*(r)
b. #define l(r) 2*PI*(r)
c. #define fun(x) (x++)*(x)
d. #define max(x,y) x>y?x:y
(a.b.c.d)
(704) 在下列有关宏替换的叙述中,正确的说法是_____。
a. 宏替换占用运行时间
b. 宏名有类型
c. 带参数的宏替换和函数等价
d. 宏替换只是字符替换
(d)
(705) 设有以下宏定义:
#define N 3
#define Y(n)((N1)*n)
则执行语句:z=2 *(NY(51));后,z的值为
a. 出错 b. 42 c. 48 d. 54
(a)
(706) 宏定义#define PI 31.14159中,宏名PI代替______。
a. 单精度 b. 双精度 c. 常量 d. 字符串
(d)
(707) 编译预处理命令以___________结尾。
a. ; b. . c. \ d. 回车
(d)
8.2 填空题
(708) 设有以下宏定义:
#define WIDTH 80
#define LENGTH WIDTH+40
则执行赋值语句: v=LENGTH*20;(v为int型变量)后,v的值是____。
(709) 以下程序运行结果是____。
#define DEBUG
main()
{
int a=20,b=10,c;
c=a/b;
#ifndef DEBUG
printf("a=%o,b=%o",a,b);
#endif
printf("c=%d\n",c);
}
(710) 设有以下程序,为使之正确运行,请在括号中填入应包含的命令行。其中函数try_me在myfile.h中定义。
________
________
main()
{
printf("\n");
try_me();
printf("\n");
}
(711) 下面程序的运行结果是_____:
#define MUL(z) (z)*(z)
main()
{
printf("%d\n",MUL(1+2)+3);
}
(712) 下列程序段的输出是_______。
#define f(a, b, x) a*x+b
printf("%d, %dn", f(3,2,1), f(6, 5, f(3, 2, 1)));
(713) 若有以下宏定义:#define STR "%d,%c"
#define A 97
已知字符a的ASCII码值为97,则语句printf(STR,A,A+2);的输出结果为______。
(714) 宏定义有效范围从定义处开始,到本源程序结束处中止。但可以用__________来提前解除宏定义的作用。
(715) 下面程序的输出结果是_____。
#define FMT "%d,"
main()
{
int b[][4] = {1,3,5,7,9,11,13,15,17,19,21,23};
printf(FMT, *(*(b+1)+1));
printf(FMT, b[2][2]);
}
8.3 问答与设计
(716) 下面类型定义语句,哪种方法更好?为什么?
#define dPS struct s *
typedef struct s * tPS;
(717) 头文件中的ifndef/define/endif语句是干什么用的?
(718) 判断下面预编译条件语句是否正确,并改正:
if ((cond == GLRUN)
#ifdef DEBUG
|| (cond == GLWAIT)
#endif
)
{
…
}
(719) 判断下面预编译条件语句是否正确,并改正:
#define INIT_RECT_VALUE(a, b)\
a = 0;\
b = 0;
(720) 用typedef定义一个文件指针FP。
(721) 假如使用了禁止在while的条件部分进行赋值的编译程序选择项,为什么可以查出下面代码中的运算优先级错误?
While(ch = getchar() != EOF)
(722) 怎样使用编译程序查出下面无意使用的空语句和赋值语句?
a. if (nCome == 063)。这里程序的本意是十进制63判断,但因为前面多了一个0使063成了八进制数。结果变成了51。
b. If(pb != NULL & pb != 0xff)。这里不小心把&&键入为&,结果即使pb等于NULL还会执行*pb != 0xff。
c. quot = numer/*pdenom。这里无意间多了个*号结果使/*被解释为注释的开始。
d. word = bHigh<<8 + bLow。由于出现了运算优先级错误,该语句被解释成了:word = bHigh << (8+bLow)
(723) 编译程序怎样才能对"没有与之配对的else"这一错误给出警告?应该怎样消除这一警告?
(724) 如果宏UINT_MAX定义在limit.h中,但假如在程序中忘了include这个头文件,下面的伪指令就会无声无息地失败,因为预处理程序会把预定义的UINT_MAX替换成0:
……
#if UINT_MAX > 65535U
……
#endif
怎样使预处理程序报告出这一错误?
(725) 什么是宏(macro)?使用宏有哪些好处?
(726) 请说明有参宏和有参函数的区别。
(727) 请说明宏定义的有效范围。
(728) 文件包含的优点是什么?
(729) 请写出条件编译的宏命令。
(730) 指针作为函数参数时能够改变实参的值,请说明其原理。
(731) 使用宏更好,还是使用函数更好?
(732) 什么时候应该用宏代替函数?
(733) 怎样建立对类型不敏感的宏?
(734) 什么是标准预定义宏?
(735) 怎样取消一个已定义的宏?
(736) 预处理程序(preprocessor)有什么作用?
(737) 什么是标准预定义宏?
(738) 标准预定义宏__FILE__有什么作用?
(739) 标准预定义宏__LINE__有什么作用?
(740) 标准预定义宏__DATE__和__TIME__有什么作用?
(741) 怎样才能使程序打印出发生错误的行号?
(742) 怎样才能使程序打印出发生错误的源文件名?
(743) 怎样判断一个程序是用C编译程序还是用C++编译程序编译的?
(744) 怎样避免多次包含同一个头文件?
(745) 可以用#include指令包含类型名不是".h"的文件吗?
(746) #include
和#include"file"有什么不同?
(747) 预处理指令#pragma有什么作用?
(748) #line有什么作用?
(749) 包含文件可以嵌套吗? 包含文件最多可以嵌套几层?
(750) 用#define指令说明常量有什么好处?
(751) 与用#define指令说明常量相比,用enum关键字说明常量有什么好处?
(752) 怎样检查一个符号是否已被定义?
(753) 如何使部分程序在演示版中失效?
(754) 预处理指令#pragma有什么作用?
(755) #line有什么作用?
(756) 连接运算符"##"有什么作用?
(757) 请说明typedef与#define的共同点和不同点。
(758) 当程序员为枚举类型增加新元素时,有时会忘记在相应的switch语句中增加新的case条件。怎样才能使用断言帮助查出这个问题?
(759) 请指出下面函数中的断言的错误并改正。
/* getline ─── 将一个以\n结尾的行读入缓冲区中 */
void getline(char* pch)
{
int ch; // ch"必须"是int
do
{
ASSERT( (ch = getchar()) != EOF );
}
While( (*pch++=ch) != '\n' )
}
(760) 每当使用ASSERT,宏__FILE__就产生一个唯一的文件名字符串。怎样实现ASSERT宏,才能使文件名字符串在每个文件中只被定义一次?
(761) 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)。
(762) 写一个"标准"宏MIN ,这个宏输入两个参数并返回较小的一个。
#define MIN(A,B) ((A)<= (B) ? (A) : (B) )
(763) 预处理器标识#error的目的是什么?
(764) 写出下列程序段的输出结果。
#define A 10
#define B (Aprintf("%d", B*2);
(765) 头文件中的 ifndef/define/endif 干什么用?
(766) #include 和 #include"filename.h" 有什么区别?
(767) 用typedef语句定义一个返回整型的函数指针类型FPI。
9. 内存管理
9.1 填空题
(768) 下面程序的输出是_____,为什么?
char *ptr;
if ((ptr = (char *)malloc(0)) == NULL)
{
puts("Got a null pointer");
}
else
{
puts("Got a valid pointer");
}
(769) 以下程序运行后的输出结果是______ 。
main()
{
char m;
m='B'+32; printf("%c\n",m);
}
已有定义如下:
struct node
{
int data;
struct node *next;
} *p;
以下语句调用malloc函数,使指针p指向一个具有struct node类型的动态存储空间。请填空。
p = (struct node *)malloc(________);
(770) 在绝对地址0xXXXXXXXX上写入字符'a'的语句是___________。
unsigned char *p = (unsigned char *)0xF000FF00;
*p = 'a';
9.2 问答与设计
(771) 对下面程序段进行解释:
typedef void (*lpFunction)();
lpFunction lpReset = (lpFunction)0xF000FFF0;
lpReset();
(772) 结合编译优化原理,指出下面程序存在的问题并修改。
int a,b,c;
a = inWord(0x100); // 读取I/O空间0x100端口的内容存入a变量
b = a;
a = inWord (0x100); // 再次读取I/O空间0x100端口的内容存入a变量
c = a;
(773) 以下为常见的内存错误,请分别给出解决措施:
a. 内存分配未成功,却使用了它;
b. 内存分配虽然成功,但是尚未初始化就引用它;
c. 忘记了释放内存,造成内存泄露;
d. 内存释放成功,却继续使用它。
(774) 嵌入式系统中动态分配内存可能发生的问题有哪些?
(775) 请分析下面代码,指出问题并改正:
void GetMemory(T_S8 *p, T_S16 nNum)
{
p = (T_S8 *)malloc(sizeof(T_S8) * nNum);
}
void Test(void)
{
T_S8 *str = NULL;
GetMemory(str%