[問題]遞增運算子的考題

作者: blueblueChen (藍藍欠)   2018-08-25 09:55:42
i = 10;
i = i++ + ++i;
i是多少
答案是 22
假設是三個變數就算了 c = a++ + ++b; 還可以理解。這是同個變數
最後會看起來是 10 + 11 = 21, 21再做後增的動作。
盲點是 ++i -> i = 11;
i++ -> 此時的 i 不應該是 11嗎??
應該要出來 11 + 11 = 22,最後才做 22 後增動作 為 23 才對吧..?
作者: ggBird (ggBird)   2018-08-25 10:05:00
ub
作者: Schottky (順風相送)   2018-08-25 10:12:00
undefined behavior,出考題的是誰,叫他不用來上班了置底十三戒之第八戒,這不是你的問題,考題不能這樣出
作者: moebear (萌熊)   2018-08-25 10:14:00
作者: eye5002003 (下一夜)   2018-08-25 10:41:00
我有寫過這樣的考題,一個老工程師出的
作者: chuegou (chuegou)   2018-08-25 11:43:00
r1=i++; r2=++i; i=r1+r2; 我猜啦如果硬要知道為什麼是22 反組譯看組語如何?
作者: stupid0319 (徵女友)   2018-08-25 12:52:00
何必浪費生命在智障的問題上
作者: sarafciel (Cattuz)   2018-08-25 13:27:00
未定義指的是"標準"未定義C的標準沒有定義 i++ + ++i 時三個運算元的執行順序所以編譯器在編這行的時候就是隨編譯器高興的意思編是一定可以編過 只是你換個編譯器結果就不一樣子BTW 出這考題的是智障 不要理他
作者: blueblueChen (藍藍欠)   2018-08-25 18:47:00
那為何 x=x++叫做未定義 *p++ 就不是?
作者: jerryh001   2018-08-25 19:02:00
因為*p++明確知道怎麼做
作者: as7218 (Kaigiks)   2018-08-25 22:14:00
作者: blueblueChen (藍藍欠)   2018-08-25 22:20:00
我有看jserv的 blogC 語言沒規定 i++ 或 ++i 的「加 1」動作到底是在何時時刻執行,所以說 printf("%d\n",a++); 也會不知道 [+1] 是在何時進行的嗎? 但從以前的經驗來看都是先印出,再[+1]
作者: AstralBrain   2018-08-25 22:33:00
對, 不知道印出來的值是"a++"這個expression的傳回值不是a當下的值
作者: sarafciel (Cattuz)   2018-08-25 23:26:00
靠XD 翻了一下標準 如果我的破英文沒有影響理解的話+1執行的時間點在99以前沒定 11以後是有定的XDDD詳情見C11標準6.5.2.4 不過這篇問的東西還是UB就是了
作者: oToToT (屁孩)   2018-08-26 14:41:00
總之,沒事不要這樣寫最保險,可讀性有夠低

Links booklink

Contact Us: admin [ a t ] ucptt.com