作者tcc740sd (不要問)
看板C_and_CPP
標題[問題] 用 "++" 來遞增的基本問題
時間Fri Jun 5 19:42:27 2009
小弟剛接觸C++不久
今天看到一支程式
例如
int i=5,j=0;
j=++i*++i*++i
cout<<j
我本來是這樣算的
j=6*7*8 =336
卻發現j執行出來的結果是 392
於是我百思不解 把運算那行改為
j=++i
執行出來是 6 這我知道
----------------------
然後把運算式改為
j=++i*++i
執行出來卻是49 我原本以為是 6*7=42
後來想想 電腦把 兩邊的i先做++ 在相乘
j= ++i * ++i
(原本i=5 ^i=6 ^i=7 )
此時i值變為7 7*7=49 這個解出來了
----------
後來我把運算式改為
j=++i*++i*++i
照我上面的說法應該 i=8
8*8*8=512 (正解為392)
我就困頓了
後來我用計算機算 7*7*8=392
然後我把運算式改為
j=++i*++i*++i*++i
跑出來的卻是 7*7*8*9 的答案 3528
-------------------------
此時有點頭緒
++i*++i
我想法是 電腦是先對 "第一個乘法式" 的兩個值做++處理
︾ i=7
j= ++i*++i *++i*++i
( ^^^^^^^ =49 )
然後電腦一次只做一次乘法
j= 49 * ++i *++i
^7變8
然後 ︾ 8變9
j= 49 * 8 *++i => j= 392 * ++i
^做完了 ^接著對它做
變得很像
j= {[(++i*++i)*++i]*++i}
電腦只對一個刮弧內的兩個值有++的優先反應
------(以上不知道大家看不看得懂)------------
不知道電腦是不是這樣子跑呢? 這是我剛剛騎車想出來的
有請強大的版友解惑 m川@.川m
--
為什麼您要這麼著急呢?
http://www.wretch.cc/blog/s9021413
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.229.222.5
1F:推 littleshan:這老梗了,見十誡第九條 06/05 19:51
謝謝littleshan大的提醒,我現在知道這是錯誤的寫法了,
可是這是我哥以前他們的印度老師出的範例,是不是老師出題明顯有誤呢....
※ 編輯: tcc740sd 來自: 61.229.222.5 (06/05 20:06)
2F:推 Ebergies:為什麼您要這麼著急呢? 06/05 20:05
3F:推 yoco315:是的老師出題明顯有誤.. 06/05 20:26
4F:→ tcc740sd:可是這是我哥去年期末考題目....- - 06/05 20:28
5F:推 bobhsiao:實戰的時候不會寫這種 code 找自己麻煩 06/05 20:36
6F:→ tcc740sd:是阿是阿 我哥一直覺得他們印度老師教的方法怪怪的... 06/05 20:39
7F:推 sjgau:把時間和精力花在這個上面,實在是非常沒有意義 06/05 20:40
8F:推 stonehomelaa:阿不是印度超強的嗎 怎麼搞這個 @@ 06/05 20:46
印度人不是聽說程式語言超強的嗎....(聽說跟他們小時候教育有關)
剛小弟看到一題傻眼了 完全不知道電腦跑的順序
int x=8;
x-=--x - x--;
cout<<x;
很明顯的是錯誤題型 , 可是我好想知道電腦怎麼跑的 (強烈的求知慾)
這題 x = 6
※ 編輯: tcc740sd 來自: 61.229.222.5 (06/05 21:01)
9F:推 zlw:所以,就只是聽說啊。美國怎樣也贏印度吧 06/05 21:03
10F:→ tcc740sd:放棄了 哈哈 想半天還是不知道電腦執行的順序 06/05 21:21
11F:推 zlw:你可以找本計算機組織教科書來看,最有名就白算盤。 06/05 21:22
12F:→ zlw:電腦就是一行一行組合語言的指令這樣跑,所以你只要用你寫程式 06/05 21:22
13F:→ zlw:的軟體讓他拿出該行的組譯碼就可以知道細節 06/05 21:23
14F:→ zlw:Visual Studio選偵錯後,隨便中斷點,隨便一行右鍵->反組譯碼 06/05 21:24
15F:→ StubbornLin:我還以為只有台灣的老師會玩這種東西= = 06/05 22:29
17F:→ tcc740sd:謝謝樓上跟樓樓樓上 .....十萬分感謝 06/05 22:48
18F:推 VictorTom:推樓樓上的連結:) 06/05 22:56
19F:推 stonehomelaa:找工作面試也會遇到這種 囧 06/05 23:07
20F:推 maxi326:真的很誤導人的題目,不過應該因為++本來就優先於* 06/05 23:51
21F:→ maxi326:所以會先把所有++做完再做*,就是392 06/05 23:52
22F:推 maxi326:看了答案,未定義真是太屌了 06/05 23:54
23F:推 damody:因為編譯器這樣決定的。 06/07 02:41
24F:→ adrianshum:印度人? 我想哪個地方都有強的也有不濟的人. 我踫過兩 06/07 16:36
25F:→ adrianshum:個印度 consultant 就極度不知所謂了 06/07 16:36
26F:推 del680202:用java測了一下 結果跟你的"完全"不同 06/09 02:10
27F:→ del680202:所以這東西不須要太鑽牛角尖 06/09 02:10