作者LPH66 (-858993460)
看板C_and_CPP
標題Re: [問題] ++i + ++i + ++i
時間Mon Nov 14 03:38:04 2011
※ 引述《damnfool (該死的傻子)》之銘言:
: : int x=5,y;
: : y= ++x * ++x * ++x;
: 6 * 6 * 6 //6可以拿來相乘,但是沒東西可以乘
: 7 * 7 * 7 //前兩個位置也就是7*7可以相乘,暫存49
: 49 * 8 //第三個位置可以拿來相乘,49*8=392,丟給y
: y=392
: ++遞增運算子會加三次,
: 相乘運算子的結合性,由左到右,
: 第一次乘第一個,第二次乘第二個,第三次乘第三個。
我們得先知道一下 ++x 的作用包括哪些:
(1) 提取 x 的值
(2) 將(1)的值加 1
(3) 將(2)的值存回 x
(4) 求值, 提取 x 的值
那麼來看看這條式子下面這幾個順序吧:
(A1) 提取 x 的值 | (A1) 提取 x 的值 | (A1) 提取 x 的值
(A2) 將(A1)的值加 1 | (A2) 將(A1)的值加 1 | (A2) 將(A1)的值加 1
(A3) 將(A2)的值存回 x | (A3) 將(A2)的值存回 x | (A3) 將(A2)的值存回 x
(B1) 提取 x 的值 | (B1) 提取 x 的值 | (A4) 求值, 提取 x 的值
(B2) 將(B1)的值加 1 | (B2) 將(B1)的值加 1 | (B1) 提取 x 的值
(B3) 將(B2)的值存回 x | (B3) 將(B2)的值存回 x | (B2) 將(B1)的值加 1
(C1) 提取 x 的值 | (A4) 求值, 提取 x 的值 | (B3) 將(B2)的值存回 x
(C2) 將(C1)的值加 1 | (B4) 求值, 提取 x 的值 | (B4) 求值, 提取 x 的值
(C3) 將(C2)的值存回 x | (D1) 計算(A4)*(B4) | (D1) 計算(A4)*(B4)
(A4) 求值, 提取 x 的值 | (C1) 提取 x 的值 | (C1) 提取 x 的值
(B4) 求值, 提取 x 的值 | (C2) 將(C1)的值加 1 | (C2) 將(C1)的值加 1
(D1) 計算(A4)*(B4) | (C3) 將(C2)的值存回 x | (C3) 將(C2)的值存回 x
(C4) 求值, 提取 x 的值 | (C4) 求值, 提取 x 的值 | (C4) 求值, 提取 x 的值
(D2) 計算(D1)*(C4) | (D2) 計算(D1)*(C4) | (D2) 計算(D1)*(C4)
↓ ↓ ↓
結果:512 結果:392 結果:336
很湊巧的,這三個結果都是實際會出現的結果:
512 是我的 VC 2005 給的答案
392 是我的 gcc 4.1.0 給的答案
336 則是 Java 給的答案...
C/C++ 在這裡並沒有規定要採取上述三種 (以及其他不知道多少種) 順序中的哪一個
因此出現什麼結果都不能意外
(嚴格講起來這句話把 undefined 和 implementation defined 扯在一起講了
不過反正我們只要知道它不一定會照我們想要的去做就是)
相對的, Java 有規定在這個時候一定要採取上面最右邊那種順序
(也就是運算子的一邊要完全算完才會進入另一邊)
但這依然不會抹滅它是一個差勁透頂的程式寫作方式就是了
=========================
(以下是壞學生示範)
這樣的話碰到這種老師我可能會這樣講
「我下載了最新的 Java,然後把這個程式用 Java 寫,執行後卻得到 336 耶」
「難道是 Java 錯了嗎?」
「既然大家都做錯了,那我們寫程式就不要寫這種大家都會做錯的寫法好了」
「那麼這個考題就送分好了,因為大家都做錯了」
...嘛如果對方是拉不下臉被羞辱的人的話我的下場就會很慘了 (yay)
--
実琴:「
河野!你真的就這樣被
物質慾望給吸引過去了嗎?!」
亨:「只要
穿著女裝擺出親切的樣子,所有必要花費就能
全免,似乎一點都不壞啊。」
実琴:「難道你沒有
男人的尊嚴了嗎?!」
亨:(斷然道)「
沒有。在
節衣縮食且
生活吃緊的
學生面前,
沒有那種東西。」
--プリンセス・プリンセス 第二話
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.230.62
→ purincess:yay lph66 大大萬歲 11/14 03:40
→ purincess:XDD 11/14 03:40
→ purincess:我剛剛一直在等你po打臉.. 11/14 03:40
※ 編輯: LPH66 來自: 140.112.230.62 (11/14 03:45)
推 tropical72:推推推 :) 11/14 04:32
推 damnfool:臉拉不下來活該...... 11/14 05:47
→ damnfool:這個問題本來就不適合當程式設計第一堂課的作業 11/14 05:49
推 damnfool:臉拉不下來就吃全班的拳頭,LPH66幫我傳福音一下 11/14 06:06
→ damnfool:Oracle會買Java好像有點道理 11/14 06:09
→ diabloevagto:大大認真了... 11/14 08:01
推 damnfool:倒也不只給LPH66看的而已,所有的在學學生都可以參考 11/14 08:54
→ angleevil:我覺得這個題目,可能到我進棺材.還是會有教授出此題 11/14 11:49
→ angleevil:而且在台灣的企業環境下,這種戲碼也常上演.重點就是 11/14 11:51
→ angleevil:認真就輸掉了 11/14 11:51
→ windincloud:推 認真就輸掉了~ :P 11/14 14:00
推 xatier:L大,您認真了XD 11/14 14:43
推 cutecpu: L 大的回文都很詳細,很好看XD 11/14 15:17
→ angleevil:我是說跟教授認真.因為有些教授聽不進去人話的 11/14 16:44
→ angleevil:有些教授是很能納言. 這是真的要看人. 11/14 16:45
推 jason12308:我用我的腦袋直覺就是6*7*8.........= = 11/14 16:45
→ james732:教授的答案就是答案,拿到學分就可以說再見了 (無誤) 11/14 16:46
推 jason12308:我們教授會說:我們來打賭,用CODE RUN ANSWER出來 11/14 16:52
→ jason12308:你的答案對的話就直接讓你過,錯的話就直接當掉XDDDDD 11/14 16:52
推 tomap41017:L大讚啦 11/14 20:50
推 VictorTom:讚XD 11/14 22:49
→ kikiqqp:台灣的教育體系中,教程式的很多可能連程式怎麼寫都不曉得 11/15 00:35
→ james732:其實我可以接受,教授應該要研究一些比寫程式更重要的事 11/15 00:51
→ james732:但這樣的話,也不知道有誰可以來教程式了... 11/15 00:52
推 tropical72:推james大,教學的工作一向由james大擔任不是嗎? ^^ 11/15 01:00
→ james732:如果有大學願意聘我去教程式,我會很樂意哈哈 11/15 01:03
→ james732:不過我的個性不會是個受學生歡迎的老師 11/15 01:03
→ xatier:怎麼會呢? 我覺得超哥人很好阿!又帥又強XD 11/15 02:21
→ james732:樓上亂說 XD 11/15 02:46
→ angleevil:認真的男人最帥,因為james一值很認真.故得証.james最帥 11/15 08:18
→ james732:.........我覺得最近還挺不認真的啊 11/15 12:59
推 chrisQQ:你最近很不帥,得證(疑疑 11/15 13:18
推 james732:..........樓上 orz 11/15 13:19
推 leonjye:真的被呼喚出來了 L大 good job 11/16 09:59