嵌入式系统开发人员C语言测试题编程风格问答填空题_第1页
嵌入式系统开发人员C语言测试题编程风格问答填空题_第2页
嵌入式系统开发人员C语言测试题编程风格问答填空题_第3页
嵌入式系统开发人员C语言测试题编程风格问答填空题_第4页
嵌入式系统开发人员C语言测试题编程风格问答填空题_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、3.2 填空题 (267) 根据编码规范,所有代码都应_级以上的warning编译成功。 (268) 根据编码规范,所有的源文件应是可打印的_,在编辑器中定义 TAB 键自动用_8个空格代替。 (269) 根据编码规范,文件名和目录的长度不要超过_255_字符。 (270) 头文件应避免被重复引用,应使用_预处理块。 (271) 用 #include 格式来引用_。 (272) 用 #include filename.h 格式来引用_。 (273) 根据编码规范,声明函数原型时给出参数名称和类型,并且与实现此函数时的参数名称、类型保持一致,无参数的函数,用_void_声明。 (274) 根据编

2、码规范,代码文件不要超过_行,一个函数的代码不要超过_53_行, 每行不应超过_个字符。 (275) 一个程序中的空行数目最好占总代码行的_,注释行数不应少于总代码行的_20_%_。 (276) 目录、文件的命名均不要超过_255_个字符。 3.3 问答与设计 (277) 使用goto语句会有什么不良后果? (278) 为什么要尽量避免函数带有记忆功能? 尽量避免函数带有“记忆”功能。相同的输入应当产生相同的输出。 带有“记忆”功能的函数,其行为可能是不可预测的,因为它的行为可能取决于某 种“记忆状态”。这样的函数既不易理解又不利于测试和维护。在C/C+语言中,函数的 static 局部变量是

3、函数的“记忆”存储器。建议尽量少用static 局部变量,除非必需。(279) 不设计多参数函数的目的是什么?尽量不设计多参数函数,将不使用的参数从接口中去掉,降低接口复杂度,减少函数间接口的复杂度 (280) 分别说明extern、static、auto变量的作用域范围。 extern(外部的)这是在函数外部定义的变量的缺省存储; 方式.extern变量的作用域是整个程序;.static(静态的)在函数外部说明为static的变量的作用 域为从定义点到该文件尾部;在函数内部说明为static的变量的作 用域为从定义点到该局部程序块尾部.;auto(自动的)这是在函数内部说明的变量的缺省存储方

4、 式.auto变量的作用域为从定义点到该局部程序块尾部(281) 什么是const指针? (282) 什么时候应该使用const修饰符?用const修饰常量有什么好处? (283) 什么时候应该使用register修饰符? 数据存储在寄存器中的变量称为寄存器变量。寄存器变量具有与自动变量完全相同的性质,只是该种变量放在寄存器中。从寄存器中存取数据的速度比从内存中存取数据快得多,因此通常把使用频率较高的变量定义为register类别(284) 什么时候应该使用volatile修饰符? volatile修饰符告诉编译程序不要对该变量所参与的操作进行某些优化。在两种特殊的情况下需要使用volatil

5、e修饰符:第一种情况涉及到内存映射硬件(memory-mapped hardware,如图形适配器,这类设备对计算机来说就好象是内存的一部分一样),第二种情况涉及到共享内存(shared memory,即被两个以上同时运行的程序所使用的内存)。大多数计算机拥有一系列寄存器,其存取速度比计算机主存更快。好的编译程序能进行一种被称为“冗余装入和存储的删去”(redundant load and store removal)的优化,即编译程序会在程序中寻找并删去这样两类代码:一类是可以删去的从内存装入数据的指令,因为相应的数据已经被存放在寄存器中;另一种是可以删去的将数据存入内存的指令,因为相应的数

6、据在再次被改变之前可以一直保留在寄存器中。如果一个指针变量指向普通内存以外的位置,如指向一个外围设备的内存映射端口,那么冗余装入和存储的优化对它来说可能是有害的。(285) 一个变量可以同时被说明为const和volatile吗?可以。const修饰符的含义是变量的值不能被使用了const修饰符的那段代码修改,但这并不意味着它不能被这段代码以外的其它手段修改(286) 什么时候应该使用类型强制转换(typecast)?在两种情况下需要使用类型强制转换。第一种情况是改变运算分量的类型,从而使运算能正确地进行。下面的程序与212中的例子相似,但有不同之处。变量n被赋值为整数i除以整数j的结果,因为

7、是整数相除,所以结果为0。变量f2也被赋值为i除以j的结果,但本例通过(float)类型强制转换把i转换成一个float类型,因此执行的是浮点数除法运算(见211),结果为075。#include main ( )int i = 3;int j = 4float f1 =i/j;float f2= (float) i/j;printf(3/4= %g or %g depending on the type used. n,f1, f2);第二种情况是在指针类型和void * 类型之间进行强制转换,从而与期望或返回void指针的函数进行正确的交接。例如,下述语句就把函数malloc()的返回值强

8、制转换为一个指向foo结构的指针:struct foo *p(struct foo *)malloc(sizeof(struct foo); (287) 什么时候不应该使用类型强制转换(typecast)? 不应该对用const或volatile说明了的对象进行类型强制转换,否则程序就不能正确运行。不应该用类型强制转换把指向一种结构类型或数据类型的指针转换成指向另一种结构类型或数据类型的指针。在极少数需要进行这种类型强制转换的情况下,用共用体(union)来存放有关数据能更清楚地表达程序员的意图。(288) 怎样判断一个数字型变量可以容纳的最大值? 要判断某种特定类型可以容纳的最大值或最小值,

9、一种简便的方法是使用ANSI标准头文件limits.h中的预定义值。该文件包含一些很有用的常量,它们定义了各种类型所能容纳的值,对于整数类型,在使用2的补码运算的机器(你将使用的机器几乎都属此类)上,一个有符号类型可以容纳的数字范围为-2位数-1到(+2位数-1-1),一个无符号类型可以容纳的数字范围为0到(+2位数-1)。例如,一个16位有符号整数可以容纳的数字范围为-215(即-32768)到(+215-1)(即+32767)。(289) 对不同类型的变量进行算术运算会有问题吗? C有三类固有的数据类型:指针类型、整数类型和浮点类型;指针类型的运算限制最严,只限于以下两种运算:- 两个指针

10、相减,仅在两个指针指向同一数组中的元素时有效。运算结果与对应于两个指针的数组下标相减的结果相同。 + 指针和整数类型相加。运算结果为一个指针,该指针与原指针之间相距n个元素,n就是与原指针相加的整数。浮点类型包括float,double和longdouble这三种固有类型。整数类型包括char,unsigned char,short,unsigned short,int,unsigned int,long和unsigned long。对这些类型都可进行以下4种算术运算:+ 加 - 减* 乘 / 除对整数类型不仅可以进行上述4种运算,还可进行以下几种运算:% 取模或求余 右移 左移& 按位与|

11、按位或 按位异或! 逻辑非 取反尽管C允许你使用“混合模式”的表达式(包含不同类型的算术表达式),但是,在进行运算之前,它会把不同的类型转换成同一类型(前面提到的指针运算除外)。这种自动转换类型的过程被称为“运算符升级(operator promotion)”。请参见:(290) 请回答下面关于标识符命名规则的问题: a. 可以用下划线开头吗? b. 可以用数字开头吗? c. 大小写字母表示的意义一样吗? d. 长度可以超过32个字符吗? e. 可以使用系统关键字吗? (291) 较长的变量名会影响程序的速度、大小或效率吗? (292) 使用注释会影响程序的速度、大小或效率吗? (293) 使

12、用空白符会影响程序的速度、大小或效率吗? (294) 请说明变量的命名规则。 (295) 请说明函数命名。 (296) 请说明如何命名常量和宏。 (297) 请说明如何命名用户定义类型。 (298) 使用大括号的正确方法是什么? (299) 使用#define命令定义宏常量的好处有哪些? (300) 全局函数的命名应该使用前缀_动作+名词+属性(参数) (动宾词组)的规则,局部函数的命名去掉前缀。前缀用来说明什么? (301) 变量的命名应该使用前缀_名词或者前缀_形容词+名词规则。前缀用来说明什么? (302) 分析比较下面代码的执行效率: a. for (row=0; row100; ro

13、w+) for (col=0; col5; col+) sum = sum + arowcol; b. for (col=0; col5; col+) for (row=0; row100; row+) sum = sum + arowcol; (303) 分析比较下面代码的执行效率: a. for (i=0; iN; i+) if (condition) DoSomething(); else DoOtherthing(); b. if (condition) for (i=0; iN; i+) DoSomething(); else for (i=0; iN; i+) DoOtherthi

14、ng(); (304) 分析比较下面代码的执行效率: a. for (i = 0; i MAX_ADD_NUMBER; i+) nSum += i; nBackSum = nSum ; / 备份和 b. for (i = 0; i MAX_ADD_NUMBER; i+) nSum += i ; nBackSum = nSum ; / 备份和 (305) 不要把参数作为局部变量使用的原因是什么? (306) const 有什么用途?(请说明三种) (307) 尽量不要省略函数返回值的类型,原因是什么? (308) 为什么要在头文件而不是程序文件中声明extern? (309) 请指出下面代码的错

15、误并改正。 / module1.h int a = 5; / 在模块1的.h文件中定义int a / module1 .c #include module1.h / 在模块1中包含模块1的.h文件 / module2 .c #include module1.h / 在模块2中包含模块1的.h文件 / module3 .c #include module1.h / 在模块3中包含模块1的.h文件 (310) 请分析下面代码的有效性: while (c = t | c = | c = n) c = getc(f); (311) 整理下面代码,使其符合编码规范: int a = 5, b = 7,

16、c; c = a+b; (312) 如何优化下面代码: void main(void) int i, value100; for (i = 0; i 100; i+) valuei = i; (313) 如何优化下面代码: main(void) register int nCounter; int values100; int a = 1, b = 1, c = 2; for (nCount = 0; nCount 100; nCounter+) valuesnCounter = (a * b) + c + nCounter; return 0; (314) 如何优化下面的代码: void f

17、unc1(int i, int j) int k=20; int a,b,c; a=i*j/k; b=i*j/k; c=i*j/k; ; (315) 如何优化下面的代码: #define uchar unsigned char #define uint unsigned ini #define LEN 20 void fun1(int num) uchar i; uint memLEN for (i = 0; i num*4+2; j+) memi=0; (316) 如何优化下面的代码: #define uchar unsigned char #define uint unsigned int #define LEN uchar array1LEN; uchar array2LEN; void func1() uchar I; uint sum=0; for(i=0;iLEN;i+) sum = sum + array1i + array2i; (317) 如何优化下面代码:

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论