资源预览内容
第1页 / 共43页
第2页 / 共43页
第3页 / 共43页
第4页 / 共43页
第5页 / 共43页
第6页 / 共43页
第7页 / 共43页
第8页 / 共43页
第9页 / 共43页
第10页 / 共43页
亲,该文档总共43页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
1. 用预处理指令#define 声明一个常数,用以表明 1 年中有多少秒(忽略闰年问题)#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL 我在这想看到几件事情: 1). #define 语法的基本知识(例如:不能以分号结束,括号的使用,等等) 2). 懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中有多少秒而不是计算出实际的值,是更清晰而没有代价的。 3). 意识到这个表达式将使一个 16 位机的整型数溢出-因此要用到长整型符号 L,告诉编译器这个常数是的长整型数。 4). 如果你在你的表达式中用到 UL(表示无符号长整型),那么你有了一个好的起点。记住,第一印象很重要。2. 写一个“标准”宏 MIN,这个宏输入两个参数并返回较小的一个。#define MIN(A,B) (A) 6) puts( 6) : puts(6”。原因是当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型。 因此-20 变成了一个非常大的正整数,所以该表达式计算出的结果大于 6。这一点对于应当频繁用到无符号数据类型的嵌入式系统来说是丰常重要的。如果你答错了这个问题,你也就到了得不到这份工作的边缘。13. 评价下面的代码片断:unsigned int zero = 0; unsigned int compzero = 0xFFFF; /*1s complement of zero */对于一个 int 型不是 16 位的处理器为说,上面的代码是不正确的。应编写如下:unsigned int compzero = 0;这一问题真正能揭露出应试者是否懂得处理器字长的重要性。在我的经验里,好的嵌入式程序员非常准确地明白硬件的细节和它的局限,然而 PC 机程序往往把硬件作为一个无法避免的烦恼。 到了这个阶段,应试者或者完全垂头丧气了或者信心满满志在必得。如果显然应试者不是很好,那么这个测试就在这里结束了。但如果显然应试者做得不错,那么我就扔出下面的追加问题,这些问题是比较难的,我想仅仅非常优秀的应试者能做得不错。提出这些问题,我希望更多看到应试者应付问题的方法,而不是答案。不管如何,你就当是这个娱乐吧动态内存分配(Dynamic memory allocation)14. 尽管不像非嵌入式计算机那么常见,嵌入式系统还是有从堆(heap )中动态分配内存的过程的。那么嵌入式系统中,动态分配内存可能发生的问题是什么?这里,我期望应试者能提到内存碎片,碎片收集的问题,变量的持行时间等等。这个主题已经在 ESP 杂志中被广泛地讨论过了(主要是 P.J. Plauger, 他的解释远远超过我这里能提到的任何解释),所有回过头看一下这些杂志吧!让应试者进入一种虚假的安全感觉后,我拿出这么一个小节目:下面的代码片段的输出是什么,为什么?char *ptr; if (ptr = (char *)malloc(0) = NULL) puts(Got a null pointer); else puts(Got a valid pointer); 这是一个有趣的问题。最近在我的一个同事不经意把 0 值传给了函数 malloc,得到了一个合法的指针之后,我才想到这个问题。这就是上面的代码,该代码的输出是“Got a valid pointer”。我用这个来开始讨论这样的一问题,看看被面试者是否想到库例程这样做是正确。得到正确的答案固然重要,但解决问题的方法和你做决定的基本原理更重要些。Typedef 15. Typedef 在 C 语言中频繁用以声明一个已经存在的数据类型的同义字。也可以用预处理器做类似的事。例如,思考一下下面的例子: #define dPS struct s * typedef struct s * tPS; 以上两种情况的意图都是要定义 dPS 和 tPS 作为一个指向结构 s 指针。哪种方法更好呢?(如果有的话)为什么? 这是一个非常微妙的问题,任何人答对这个问题(正当的原因)是应当被恭喜的。答案是:typedef 更好。思考下面的例子: dPS p1,p2; tPS p3,p4;第一个扩展为 struct s * p1, p2;上面的代码定义 p1 为一个指向结构的指,p2 为一个实际的结构,这也许不是你想要的。第二个例子正确地定义了 p3 和 p4 两个指针。晦涩的语法16. C 语言同意一些令人震惊的结构, 下面的结构是合法的吗,如果是它做些什么? int a = 5, b = 7, c; c = a+b;这个问题将做为这个测验的一个愉快的结尾。不管你相不相信,上面的例子是完全合乎语法的。问题是编译器如何处理它?水平不高的编译作者实际上会争论这个问题,根据最处理原则,编译器应当能处理尽可能所有合法的用法。因此,上面的代码被处理成: c = a+ + b; 因此, 这段代码持行后 a = 6, b = 7, c = 12。 如果你知道答案,或猜出正确答案,做得好。如果你不知道答案,我也不把这个当作问题。我发现这个问题的最大好处是:这是一个关于代码编写风格,代码的可读性,代码的可修改性的好的话题What will print out? main() char *p1=“name”; char *p2; p2=(char*)malloc(20); memset (p2, 0, 20); while(*p2+ = *p1+); printf(“%sn”,p2); Answer:empty string. What will be printed as the result of the operation below:main() int x=20,y=35; x=y+ + x+; y= +y + +x; printf(“%d%dn”,x,y); Answer : 5794 What will be printed as the result of the operation below:main() int x=5; printf(“%d,%d,%dn”,x,x2); Answer: 5,20,1 What will be printed as the result of the operation below:#define swap(a,b) a=a+b;b=a-b;a=a-b; void main() int x=5, y=10; swap (x,y); printf(“%d %dn”,x,y); swap2(x,y); printf(“%d %dn”,x,y); int swap2(int a, int b) int temp; temp=a; b=a; a=temp; return 0; Answer: 10, 510, 5 What will be printed as the result of the operation below:main() char *ptr = ” Cisco Systems”; *ptr+; printf(“%sn”,ptr); ptr+; printf(“%sn”,ptr); Answer:Cisco Systemsisco systems What will be printed as the result of the operation below:main() char s1=“Cisco”; char s2= “systems”; printf(“%s”,s1); Answer: Cisco What will be printed as the result of the operation below:main() char *p1; char *p2; p1=(char *)malloc(25); p2=(char *)malloc(25); strcpy(p1,”Cisco”); strcpy(p2,“systems”); strcat(p1,p2); printf(“%s”,p1); Answer: Ciscosystems The following variable is available in file1.c, who can access it?:static int average;Answer: all the functions in the file1.c can access the variable. WHat will be the result of the following code?#define TRUE 0 / some code while(TRUE) / some code Answer: This will not go into the loop as TRUE is defined as 0. What will be printed as the result of the operation below:int x; int modifyvalue() return(x+=10); int changevalue(int x) return(x+=1); void main() int x=10; x+; changevalue(x); x+; modifyvalue(); printf(First output:%dn,x); x+; changevalue(x); printf(Second output:%dn,x); modifyvalue(); printf(Third output:%dn,x); Answer: 12 , 13 , 13 What will be printed as the result of the operation below:main() int x=10, y=15; x = x+; y = +y; printf(“%d %dn”,x,y); Answer: 11, 16 What will be printed as the result of the operation below:main() int a=0; if(a=0) printf(“Cisco Systemsn”); printf(“Cisco Systemsn”); Answer: Two lines with “Cisco Systems” will be printed. 再次更新 C+相关题集1. 以下三条输出语句分别输出什么?C 易char str1 = abc;char str2 = abc;const char str3 = abc; const char str4 = abc; const char* str5 = abc;const char* str6 = abc;cout 9 ) ch += (A-9-1);char cl = c%0x10 + 0; if( cl 9 ) cl += (A-9-1);cout temp;unsigned int const size2 = temp;char str2 size2 ;9. 以下代码中的输出语句输出 0 吗,为什么?C+易struct CLSint m_i;CLS( int i ) : m_i(i) CLS()CLS(0);CLS obj;cout =0; -i ) / 反向遍历 array 数组cout ( dest );const char* psrc
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号