博客网 >

[竞猜已截止]小宇的猜想?!
作者:分类:默认分类标签:
 
 

作者:Quby /'kju:bi/

日期:2007.4

-------------------------------------------------------------------------

有奖竞猜

计算sum的结果:

  int sum = 0;

  sum += sum++ + sum;

对于第一名正确答案提供者(不可兼得)可得到:

  1.完全答对,我请吃雪糕。(¥1标准)

  2.解释原因,我请吃午饭。(¥5标准)

-------------------------------------------------------------------------

答案公布

  不确定,sum可能等于 1 或者 2。

这次获奖人员

  恭喜任广臣同学,你将获得一根由我(陈治宇)颁发的雪糕。 这意味着,你的答案正确,解释却不正确!

  从这次活动中我可以感受到任广臣同学是一个十分执着务实的同学,我喜欢,努力坚持将成为有用之材。

  2007.4.18

-------------------------------------------------------------------------

原因公布

  由于不同的编译器对于“加一”操作的处理时机不同,是造成 sum值不确定的主要原因。

 

有些编译器是先计算sum的原始数值,当本条语句运行完毕之后,再对sum进行“加一”,这样就会造成sum的最终结果为 1。以下为其计算过程,其中sum(x)表示sum变量,而其当前变量值为x,以后不再重复。

计算过程:

  (1)sum(0) +=  sum(0) + sum(0)

  (2)sum(0) +=  1

结果: sum(1) = 1

造成这样接结果的编译器,根据我个人总结有Microsoft系列的编译器,如Visual C++,和基于中间代码的编译器,如JAVA以及C#.net。这也是最常见的结果  “1”,答对这步算你入门了。

 

还有一种编译器,是完全按照C/C++语言的规定进行翻译这条语句的。首先,它取出原始变量值保存在一个临时变量中。再将原始变量进行“加一”操作,最后,在对本条语句进行计算得出结果。如果在本条语句中使用了原始变量的值,在这样就会出现与想象不一致的结果。这也就出现语言的漏洞,我出这道题就是在利用它。我想迷惑了不少的同学吧,呵呵。

计算过程:

  (1)sum(0) += 1

  (2)sum(1) += sum(0) + sum(1)

结果:sum(2) = 2

造成这种结果的编译器,目前我就找到了一种。你有没有注意到我是把这篇文章放在Embedded OS这个分类,其实这是个我有意安排的提示。这种编译器就是针对RENESAS(瑞萨)M16C的 NC30 C语言编译器,但我感觉不止这一种。因为,对于标准的C语言来说,NC30处理的方式是最为正统的,是按照规定来做的,而对与Microsoft的编译是得出1的结果,是对处理过程进行了优化。这么说是因为NC30这么做,当变量的数目不是很多的话会保存在寄存中,当超过后,将生成隐含的变量,并保存在其中,最后用时再换回寄存器中。NC30为符合标准可是废了好大的劲呀。虽然,你会说它这种做法过于死板,但是如果让你去实现某种事先规定好的语言和协议,按照规定(Specification)来是首先被考虑的。所以,要找一个这样的编译器并不是一件难事。

 

好了,我的讲解完了,大家有什么感受?是学到了什么,还是领悟到了什么?

 

你讨厌我的吹毛求疵吗,你对我的挑衅不懈一顾吗?你如果真是这么想过,我的目的就达到。首先,我花钱出这道题目的原意并不是为了炫耀我的编程功底有多么深厚,而是处于某些人或者机构老是出这种不切合实际的题去难为别人的愤慨,我是想以其人之道还制其人之身。你身边有这样或那样的人,如果你看到了或听到了,能否当时就能利用我给大家这个反例,在他最猖狂的时候给其一个下马威。其次,我希望大家能从这道题中学到如何去写一个不光你能,别人能,电脑也能懂的代码的重要。我可以负责的,告诉你,如果我是部门经理,写这样摸棱两可的代码,我是不会崇拜你的编程技巧,也是不会看好的做事方式,更不会要你的。“You are fired!”

 

2007.4.19  

 
博客网版权所有
<< [转]Bootloader --... / [转]嵌入式操作系统uC/OS ... >>

专题推荐

不平凡的水果世界

不平凡的水果世界

平凡的水果世界,平凡中的不平凡。 今朝看水果是水果 ,看水果还是水果 ,看水果已不是水果。这境界,谁人可比?在不平凡的水果世界里,仁者见仁,智者见智。

中国春节的那些习俗

中国春节的那些习俗

正月是农历新年的开始,人们往往将它看作是新的一年年运好坏的兆示期。所以,过年的时候“禁忌”特别多。当然,各个地方的风俗习惯不一样,过年的禁忌也是不一样的。

评论
0/200
表情 验证码:

Quby

  • 文章总数0
  • 画报总数0
  • 画报点击数0
  • 文章点击数0
个人排行
        博文分类
        日期归档