精華區beta C_and_CPP 關於我們 聯絡資訊
小弟最近在學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 ───────────────────────────────────────
tuiokh: 副廠的Earpod跟原廠會有差嗎?05/19 16:55
evadodoya: 那你覺得盜版的beats跟正版的有差嗎05/19 17:05
u87654321: 所以副場的earpod比較好囉?05/19 17:40
-- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.239.155.18 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1460650023.A.3AF.html
longlongint: 直覺覺得是反串文的我怎麼了 04/15 00:08
ilms49898723: Undefined Behavior 結案 04/15 00:11
longlongint: 置底十戒之八 04/15 00:11
longlongint: 十三戒之八 04/15 00:12
alkali5566: 感謝樓上幾位幫忙QQ,其實這是考試題目,所以我沒有 04/15 00:15
alkali5566: 想到是這方面的問題......學到了一課 04/15 00:15
Schottky: 考試考 undefined behavior 是怎樣 04/15 00:19
alkali5566: 而且給的答案是說0...沒說是Undefined Behavior 04/15 00:25
alkali5566: 題目我是有簡化過,不過大致上就是這邊有問題 04/15 00:25
wtchen: 下次記得看置底文喔,話說回來哪間學校出這種考題阿? 04/15 00:31
Jockey66666: 把老師當掉 04/15 00:31
Schottky: 我剛剛用 gcc 跑,結果是 1 耶~ XDD 04/15 00:31
Schottky: 然後我有開 -Wall 所以有出現 warning 04/15 00:32
Schottky: 快,拿這結果回去嗆老師要分數 04/15 00:33
alkali5566: 校名請恕我不說XD 我會跟老師反應這件事,再次感謝! 04/15 00:35
winken2004: 考試題...... 04/15 01:30
fatrabitree: 去嗆老師,連undefined behavior都不知道 04/15 01:39
tinlans: 老師真懶,改成 j = ++i 和 j = i++ 就沒事了,叫他重出 04/15 01:59
我還是先澄清一下好了,原題目是給一段code要我們debug+寫出debug後的output, 不過參考答案(好像是TA寫的)沒有提到這題有undefined behavior, 所以如果老師說這題我們應該要把這段錯誤改掉的話,我也就認了啦。 (雖然我之前沒聽過undefined behavior) ※ 編輯: alkali5566 (36.239.155.18), 04/15/2016 02:24:51
wtchen: 搞不好是TA搞錯… 04/15 02:30
wtchen: 不過老師居然沒教undefined behavior有點… 04/15 02:35
Frozenmouse: 我覺得很多老師不會教這個的…XD 04/15 02:46
bibo9901: 我一直覺得C++應該要直接讓這種statement不合法 XD 04/15 03:23
Schottky: 樓上,這類問題statement不見得全部都偵測得出來 04/15 03:42
Schottky: 寫複雜一點而逃過compiler檢查是有可能的 04/15 03:43
stupid0319: 會有人寫這樣的程式碼搞自己嗎? 04/15 07:01
suhorng: 不會搞自己, 但是踩到雷還是有可能的, 不小心 alias 到.. 04/15 07:18
ronin728: unsequenced expression,詳見C++標準規格書ISO/IEC JTC 04/15 11:14
ronin728: 1 SC22 WG21 N 3690第10頁 04/15 11:14
ronin728: Clang有很好的前端,這會有警告。GCC的話我沒試過 04/15 11:16
Schottky: 我是看 man gcc 的 -Wsequence-point 參數說明 04/15 11:53
Schottky: 上面說有些更複雜的狀況無法被這個參數偵測到 04/15 11:55
Schottky: 但一般來說應付類似程式中的類似問題還是算相當有效 04/15 11:56
Schottky: 你只要加 -Wsequence-point 或 -Wall 都會開啟這項警告 04/15 11:57
bibo9901: 我意思 有賦值(assign)的statement不視為expression 04/15 16:05
bibo9901: 一併解決了 if( x = 1 ) 這種筆誤... 04/15 16:06
Schottky: 贊成! 那些愛用 if (-1==(fd=open(...))) 的人我早就 04/15 16:11
Schottky: 看他們不順眼很久了。 04/15 16:11
Schottky: 還有那種 while (-1==(count=read(...))) 根本是邪教 04/15 16:17
bibo9901: 缺點就是 x = y = z = 1 要分成三個 stmt 了 04/15 16:24
ACMANIAC: 教到現在還沒教整個程式語言最重要的undefined behavior 04/16 09:12
ACMANIAC: 那上課到底在教什麼啊...... 04/16 09:12
TobyH4cker: 教授不可能教吧XD 學生當自強 除非教授是神人 04/16 09:44
Schottky: 教授也許不會吐 undefined behavior 這兩個字 04/16 11:04
Schottky: 但教授一定要教不可以在同一條 statement 裡面賦值兩次 04/16 11:05
Schottky: 原來是缺乏神人教授指點,難怪我們都沒有水晶球 04/16 11:06
me356500: 大學考這個哦? 04/18 22:07