Username: Password:

嵌入式C测试7
来源:

13. 评价下面的代码片断:
unsigned int zero = 0;
unsigned int compzero = 0xFFFF;
/*1's 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)
else
puts("Got a null pointer");
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
假如您知道答案,或猜出正确答案,做得好。假如您不知道答案,我也不把这个当作问题。我发现这个问题的最大好处是这是个关于代码编写风格,代码的可读性,代码的可修改性的好的话题。(结束)

(出处:赛尔电子技术中央)



喜欢本文,那就收藏到:

    Del.icio.us Google书签 Digg Live Bookmark Technorati Furl Yahoo书签 Facebook 百度搜藏 新浪ViVi 365Key网摘 天极网摘 和讯网摘 博拉网 POCO网摘 添加到饭否 QQ书签 Digbuzz我挖网
相关评论  我也要评论
还没有关于此文章的相关评论!
  • 昵称: (为空则显示guest)
  • 评论分数: ★ ★ ★★★ ★★★★ ★★★★★
  • 评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
  • 导航
    赞助商
    文章类别
    订阅