以后不要轻易说自己学过C语言的

这天班里面有个同学 ——

征集c语言答案: int f = 5; int e = ++f+++f+++f+++f; cout<马上就有同学回答 30(6+7+8+9),我说 36,都是非常自然的思路,当然 36 也不全错,TC 就是先把“++”算完最后一起加起来(9+9+9+9),但是 VC 等编译器不是。

更一般的答案是 31,原因是 VC 等编译器不是从右往左扫描计算,“++”比“+”有更高的优先级。这样:

^1 e = ++f + ++f + ++f + f; (f=6)
^2 e = ++f + ++f + f + f; (f=7)
^3 e = ++f + ++f + 14; 这里开始堆栈里面才有数据 (f=7)
^4 e = ++f + f + 14; (f=8)
^5 e = ++f + 22; (f=8)
^6 e = f + 22; (f=9)
^7 e = 31;

这个小问题教育了我们这些从 C 学到 Java 外加好几种二次开发的毕业生一个道理,以后不要轻易说自己学过 C 语言的。

3 Responses to "以后不要轻易说自己学过C语言的"

  1. 哦 我明白了

    elfox  PM Fri Mar 30  #
  2. 疫情通報

    怪物中國社會在變,人類被人獸牛狗雜種怪物交叉傳染到變異狂犬病和瘋牛病病毒,變異退化,

    繁殖到第三代牛狗特徵顯露可怕,大都象侏儒,或者骨胳亂長,

    淺顯區別在分泌牛、狗氣味、長狗牙等等。

    人類被怪物中國政權勢力和腦電波雷達設置太多不安定的因素及困擾(例如:邪教法輪功練習者、美國9.11慘案),

    被外在發生的表面事物所吸引,

    導致人類時代滅絕!

    http://groups.msn.com/m8d1c0luvi99siulbj7n36p1o4
    http://mypaper.pchome.com.tw/news/fjzzhhj71/
    http://www.wretch.cc/blog/fjzzhhj71220
    http://hk.myblog.yahoo.com/fjzzhhj71220
    http://tw.myblog.yahoo.com/fjzzhhj71220
    http://www.blogtw.com/blog.php?user=hlx1971

    黃慧傑.龍香(姬昌)

    黃慧傑  AM Sun Apr 01  #
  3. Maple兄谦虚了,不知道回字的四种写法也未必就不能轻易说自己学过中文吧。
    我很好事地试了一下这个语句,在我的BCC32中无法通过编译,必须加上空格如
    int e= ++f + ++f + ++f + ++f;
    才可以,结果为36,否则会提示需要左值。按你说的,++的优先级大于+,所以先计算所有的++才是正确的,得出30的结果似乎站不住脚。
    我猜测这个表达式的求值取决于编译器如何解析这个字符串。因为这个字符串也可以被解释为
    int e=++f++ + f++ + f++ +f;
    ,这个表达式就没法求值了。就我所知,一本似乎是叫做什么DeepC Secretes中的书提到过,Ansi C解释器应该采用所谓maximal munch strategy,就是字符串如果有多种成立的解释情况,则取能够构成最长字符串的一种。所以这个表达式会被解析成上面说的哪个不能求值的字符串,所以会报错。
    最后,会有人不用括号这样写一个赋值语句吗……

    metaphox  AM Sat Apr 14  #

Commenting is closed for this article.