Re: [問題] ++i + ++i + ++i
※ 引述《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
→
11/14 03:40, , 1F
11/14 03:40, 1F
→
11/14 03:40, , 2F
11/14 03:40, 2F
→
11/14 03:40, , 3F
11/14 03:40, 3F
※ 編輯: LPH66 來自: 140.112.230.62 (11/14 03:45)
推
11/14 04:32, , 4F
11/14 04:32, 4F
推
11/14 05:47, , 5F
11/14 05:47, 5F
→
11/14 05:49, , 6F
11/14 05:49, 6F
推
11/14 06:06, , 7F
11/14 06:06, 7F
→
11/14 06:09, , 8F
11/14 06:09, 8F
→
11/14 08:01, , 9F
11/14 08:01, 9F
推
11/14 08:54, , 10F
11/14 08:54, 10F
→
11/14 11:49, , 11F
11/14 11:49, 11F
→
11/14 11:51, , 12F
11/14 11:51, 12F
→
11/14 11:51, , 13F
11/14 11:51, 13F
→
11/14 14:00, , 14F
11/14 14:00, 14F
推
11/14 14:43, , 15F
11/14 14:43, 15F
推
11/14 15:17, , 16F
11/14 15:17, 16F
→
11/14 16:44, , 17F
11/14 16:44, 17F
→
11/14 16:45, , 18F
11/14 16:45, 18F
推
11/14 16:45, , 19F
11/14 16:45, 19F
→
11/14 16:46, , 20F
11/14 16:46, 20F
推
11/14 16:52, , 21F
11/14 16:52, 21F
→
11/14 16:52, , 22F
11/14 16:52, 22F
推
11/14 20:50, , 23F
11/14 20:50, 23F
推
11/14 22:49, , 24F
11/14 22:49, 24F
→
11/15 00:35, , 25F
11/15 00:35, 25F
→
11/15 00:51, , 26F
11/15 00:51, 26F
→
11/15 00:52, , 27F
11/15 00:52, 27F
推
11/15 01:00, , 28F
11/15 01:00, 28F
→
11/15 01:03, , 29F
11/15 01:03, 29F
→
11/15 01:03, , 30F
11/15 01:03, 30F
→
11/15 02:21, , 31F
11/15 02:21, 31F
→
11/15 02:46, , 32F
11/15 02:46, 32F
→
11/15 08:18, , 33F
11/15 08:18, 33F
→
11/15 12:59, , 34F
11/15 12:59, 34F
推
11/15 13:18, , 35F
11/15 13:18, 35F
推
11/15 13:19, , 36F
11/15 13:19, 36F
推
11/16 09:59, , 37F
11/16 09:59, 37F
討論串 (同標題文章)