3673|0

170

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

嵌入式系统开发人员C语言测试题-编译预处理 [复制链接]

本帖最后由 paulhyde 于 2014-9-15 09:21 编辑

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 (A 和 #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;

 

此帖出自电子竞赛论坛
点赞 关注
 
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表