[問題] ++i / i++

看板C_and_CPP作者 (不離不泣被當北七)時間14年前 (2010/06/06 06:37), 編輯推噓7(7019)
留言26則, 11人參與, 最新討論串1/1
( *[1m *[m 為色碼,可以按 Ctrl+V 預覽會顯示的顏色 ) ( 未必需要依照此格式,文章條理清楚即可 ) 遇到的問題: (題意請描述清楚) #include<iostream> using namespace std; int main(){ int i = 10; printf(" %d %d %d \n", ++i, i++, ++i); getchar(); return 0; } 希望得到的正確結果: 11, 11, 13 程式跑出來的錯誤結果: 13, 11, 11 開發平台: (例: VC++ or gcc/g++ or Dev-C++, Windows or Linux) Dec C++ 有問題的code: (請善用置底文標色功能) 補充說明: -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 160.39.43.40

06/06 06:49, , 1F
新手十二誡第九誡, 想要跑出11 11 13, 你就
06/06 06:49, 1F

06/06 06:50, , 2F
printf(" 11 11 13\n" ); 就好啦~
06/06 06:50, 2F

06/06 06:52, , 3F
關鍵就在 :「沒有規定先打的要先算」
06/06 06:52, 3F

06/06 06:58, , 4F
遇到這種前加後加最好還是改用好幾行來做, 程式碼愈
06/06 06:58, 4F

06/06 06:58, , 5F
直覺愈好
06/06 06:58, 5F

06/06 07:29, , 6F
看到第二行我直接爆笑 lol
06/06 07:29, 6F

06/06 11:00, , 7F
這個問題本身無解吧 因為這怎麼做語言裡並沒有規定
06/06 11:00, 7F

06/06 11:00, , 8F
而是看編譯器如何下去做
06/06 11:00, 8F

06/06 11:02, , 9F
話說剛剛很無聊用VS下去跑是 13 11 13 XD
06/06 11:02, 9F

06/06 11:43, , 10F
這很正常因為 vc從最後一個參數堆疊進去
06/06 11:43, 10F

06/06 11:44, , 11F
所以你的成是轉成組語前從後面開始算出值
06/06 11:44, 11F

06/06 11:44, , 12F
要先堆的 發現是 statement 就先被算出來了
06/06 11:44, 12F

06/06 11:51, , 13F
感謝!
06/06 11:51, 13F

06/06 14:00, , 14F
call convention issue 啦
06/06 14:00, 14F

06/06 14:00, , 15F
s/call/calling
06/06 14:00, 15F

06/06 14:33, , 16F
為什麼會有第二行 XD
06/06 14:33, 16F

06/07 00:31, , 17F
不知道是不是我才疏學淺,我好像看見C和C++同時出現
06/07 00:31, 17F

06/07 00:54, , 18F
這是C++阿, 只是沒用stream物件來輸出而已
06/07 00:54, 18F

06/07 01:07, , 19F
大概是指iostream+namespace vs printf+getchar吧@_@"
06/07 01:07, 19F

06/07 01:23, , 20F
如果引入 cstdio, 為了呼叫printf等函式, 也是要std::
06/07 01:23, 20F

06/07 01:35, , 21F
>Dannvix calling convention 不是在說這個...
06/07 01:35, 21F

06/07 01:35, , 22F
那是在說要傳參數進函式時的傳法
06/07 01:35, 22F

06/07 01:35, , 23F
這裡的問題是 evaluation order 計算順序
06/07 01:35, 23F

06/07 01:36, , 24F
同一個式子內的各個元素誰先算誰後算誰會先結算等等
06/07 01:36, 24F

06/07 01:38, , 25F
我記錯了..> <, 有時為了效率還是會選用 C 函式庫
06/07 01:38, 25F

06/07 16:14, , 26F
undefined
06/07 16:14, 26F
文章代碼(AID): #1C2j6JCb (C_and_CPP)