[問題] 關於i=i++

看板C_and_CPP作者 (鹼民五六)時間9年前 (2016/04/15 00:07), 9年前編輯推噓10(10036)
留言46則, 17人參與, 最新討論串1/1
小弟最近在學C++, 可是遇到了一個遞增運算子的問題,一直搞不懂, 比方說: int i=0; i=++i; cout << i <<endl; 可以預期是先跑i=0+1,再令i=1,因此結果為輸出1,實際上也是如此。 但是在下面的情況: int i=0; i=i++; cout << i <<endl; 我覺得應該是i=0,再令i=0+1,因此輸出1吧? 可是實際去run,結果卻是0。 想請問各位大大是為什麼為0呢? 謝謝! -- 標題 [請益] C/P值較高的耳機品牌? 看板 Headphone ───────────────────────────────────────

05/19 16:55,
副廠的Earpod跟原廠會有差嗎?
05/19 16:55

05/19 17:05,
那你覺得盜版的beats跟正版的有差嗎
05/19 17:05

05/19 17:40,
所以副場的earpod比較好囉?
05/19 17:40
-- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.239.155.18 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1460650023.A.3AF.html

04/15 00:08, , 1F
直覺覺得是反串文的我怎麼了
04/15 00:08, 1F

04/15 00:11, , 2F
Undefined Behavior 結案
04/15 00:11, 2F

04/15 00:11, , 3F
置底十戒之八
04/15 00:11, 3F

04/15 00:12, , 4F
十三戒之八
04/15 00:12, 4F

04/15 00:15, , 5F
感謝樓上幾位幫忙QQ,其實這是考試題目,所以我沒有
04/15 00:15, 5F

04/15 00:15, , 6F
想到是這方面的問題......學到了一課
04/15 00:15, 6F

04/15 00:19, , 7F
考試考 undefined behavior 是怎樣
04/15 00:19, 7F

04/15 00:25, , 8F
而且給的答案是說0...沒說是Undefined Behavior
04/15 00:25, 8F

04/15 00:25, , 9F
題目我是有簡化過,不過大致上就是這邊有問題
04/15 00:25, 9F

04/15 00:31, , 10F
下次記得看置底文喔,話說回來哪間學校出這種考題阿?
04/15 00:31, 10F

04/15 00:31, , 11F
把老師當掉
04/15 00:31, 11F

04/15 00:31, , 12F
我剛剛用 gcc 跑,結果是 1 耶~ XDD
04/15 00:31, 12F

04/15 00:32, , 13F
然後我有開 -Wall 所以有出現 warning
04/15 00:32, 13F

04/15 00:33, , 14F
快,拿這結果回去嗆老師要分數
04/15 00:33, 14F

04/15 00:35, , 15F
校名請恕我不說XD 我會跟老師反應這件事,再次感謝!
04/15 00:35, 15F

04/15 01:30, , 16F
考試題......
04/15 01:30, 16F

04/15 01:39, , 17F
去嗆老師,連undefined behavior都不知道
04/15 01:39, 17F

04/15 01:59, , 18F
老師真懶,改成 j = ++i 和 j = i++ 就沒事了,叫他重出
04/15 01:59, 18F
我還是先澄清一下好了,原題目是給一段code要我們debug+寫出debug後的output, 不過參考答案(好像是TA寫的)沒有提到這題有undefined behavior, 所以如果老師說這題我們應該要把這段錯誤改掉的話,我也就認了啦。 (雖然我之前沒聽過undefined behavior) ※ 編輯: alkali5566 (36.239.155.18), 04/15/2016 02:24:51

04/15 02:30, , 19F
搞不好是TA搞錯…
04/15 02:30, 19F

04/15 02:35, , 20F
不過老師居然沒教undefined behavior有點…
04/15 02:35, 20F

04/15 02:46, , 21F
我覺得很多老師不會教這個的…XD
04/15 02:46, 21F

04/15 03:23, , 22F
我一直覺得C++應該要直接讓這種statement不合法 XD
04/15 03:23, 22F

04/15 03:42, , 23F
樓上,這類問題statement不見得全部都偵測得出來
04/15 03:42, 23F

04/15 03:43, , 24F
寫複雜一點而逃過compiler檢查是有可能的
04/15 03:43, 24F

04/15 07:01, , 25F
會有人寫這樣的程式碼搞自己嗎?
04/15 07:01, 25F

04/15 07:18, , 26F
不會搞自己, 但是踩到雷還是有可能的, 不小心 alias 到..
04/15 07:18, 26F

04/15 11:14, , 27F
unsequenced expression,詳見C++標準規格書ISO/IEC JTC
04/15 11:14, 27F

04/15 11:14, , 28F
1 SC22 WG21 N 3690第10頁
04/15 11:14, 28F

04/15 11:16, , 29F
Clang有很好的前端,這會有警告。GCC的話我沒試過
04/15 11:16, 29F

04/15 11:53, , 30F
我是看 man gcc 的 -Wsequence-point 參數說明
04/15 11:53, 30F

04/15 11:55, , 31F
上面說有些更複雜的狀況無法被這個參數偵測到
04/15 11:55, 31F

04/15 11:56, , 32F
但一般來說應付類似程式中的類似問題還是算相當有效
04/15 11:56, 32F

04/15 11:57, , 33F
你只要加 -Wsequence-point 或 -Wall 都會開啟這項警告
04/15 11:57, 33F

04/15 16:05, , 34F
我意思 有賦值(assign)的statement不視為expression
04/15 16:05, 34F

04/15 16:06, , 35F
一併解決了 if( x = 1 ) 這種筆誤...
04/15 16:06, 35F

04/15 16:11, , 36F
贊成! 那些愛用 if (-1==(fd=open(...))) 的人我早就
04/15 16:11, 36F

04/15 16:11, , 37F
看他們不順眼很久了。
04/15 16:11, 37F

04/15 16:17, , 38F
還有那種 while (-1==(count=read(...))) 根本是邪教
04/15 16:17, 38F

04/15 16:24, , 39F
缺點就是 x = y = z = 1 要分成三個 stmt 了
04/15 16:24, 39F

04/16 09:12, , 40F
教到現在還沒教整個程式語言最重要的undefined behavior
04/16 09:12, 40F

04/16 09:12, , 41F
那上課到底在教什麼啊......
04/16 09:12, 41F

04/16 09:44, , 42F
教授不可能教吧XD 學生當自強 除非教授是神人
04/16 09:44, 42F

04/16 11:04, , 43F
教授也許不會吐 undefined behavior 這兩個字
04/16 11:04, 43F

04/16 11:05, , 44F
但教授一定要教不可以在同一條 statement 裡面賦值兩次
04/16 11:05, 44F

04/16 11:06, , 45F
原來是缺乏神人教授指點,難怪我們都沒有水晶球
04/16 11:06, 45F

04/18 22:07, , 46F
大學考這個哦?
04/18 22:07, 46F
文章代碼(AID): #1N3y0dEl (C_and_CPP)