小弟最近在學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呢?
謝謝!
作者: longlongint (華哥爾) 2016-04-15 00:08:00
直覺覺得是反串文的我怎麼了
作者: longlongint (華哥爾) 2016-04-15 00:11:00
置底十戒之八十三戒之八
感謝樓上幾位幫忙QQ,其實這是考試題目,所以我沒有想到是這方面的問題......學到了一課
考試考 undefined behavior 是怎樣
而且給的答案是說0...沒說是Undefined Behavior題目我是有簡化過,不過大致上就是這邊有問題
作者:
wtchen (沒有存在感的人)
2016-04-15 00:31:00下次記得看置底文喔,話說回來哪間學校出這種考題阿?
我剛剛用 gcc 跑,結果是 1 耶~ XDD然後我有開 -Wall 所以有出現 warning快,拿這結果回去嗆老師要分數
校名請恕我不說XD 我會跟老師反應這件事,再次感謝!
去嗆老師,連undefined behavior都不知道
作者:
tinlans ( )
2016-04-15 01:59:00老師真懶,改成 j = ++i 和 j = i++ 就沒事了,叫他重出
作者:
wtchen (沒有存在感的人)
2016-04-15 02:30:00搞不好是TA搞錯…不過老師居然沒教undefined behavior有點…
作者:
bibo9901 (function(){})()
2016-04-15 03:23:00我一直覺得C++應該要直接讓這種statement不合法 XD
樓上,這類問題statement不見得全部都偵測得出來寫複雜一點而逃過compiler檢查是有可能的
作者:
suhorng ( )
2016-04-15 07:18:00不會搞自己, 但是踩到雷還是有可能的, 不小心 alias 到..
unsequenced expression,詳見C++標準規格書ISO/IEC JTC1 SC22 WG21 N 3690第10頁Clang有很好的前端,這會有警告。GCC的話我沒試過
我是看 man gcc 的 -Wsequence-point 參數說明上面說有些更複雜的狀況無法被這個參數偵測到但一般來說應付類似程式中的類似問題還是算相當有效你只要加 -Wsequence-point 或 -Wall 都會開啟這項警告
作者:
bibo9901 (function(){})()
2016-04-15 16:05:00我意思 有賦值(assign)的statement不視為expression一併解決了 if( x = 1 ) 這種筆誤...
贊成! 那些愛用 if (-1==(fd=open(...))) 的人我早就看他們不順眼很久了。還有那種 while (-1==(count=read(...))) 根本是邪教
作者:
bibo9901 (function(){})()
2016-04-15 16:24:00缺點就是 x = y = z = 1 要分成三個 stmt 了
作者:
ACMANIAC (請肥宅救救肥宅)
2016-04-16 09:12:00教到現在還沒教整個程式語言最重要的undefined behavior那上課到底在教什麼啊......
教授也許不會吐 undefined behavior 這兩個字但教授一定要教不可以在同一條 statement 裡面賦值兩次原來是缺乏神人教授指點,難怪我們都沒有水晶球