Re: [分享] 問題導向的 學習方式

看板C_and_CPP作者 (我要加入劍道社!)時間11年前 (2013/06/24 20:11), 編輯推噓26(2608)
留言34則, 27人參與, 最新討論串1/1
※ 引述《sjgau (sjgau)》之銘言: : ※ 引述《sjgau (sjgau)》之銘言: : : 已經會的人,看看就好。不需要回應 : : 不會的人,可以參與討論。也可以私下討論 : 上面的這兩句話,很多人看不懂 因為你分享的是錯誤觀念 如果你講得夠正確夠完整 我想這個板一直很歡迎大家分享 : : int a, b, t1, t2; : : a= 10; : : b= a + 1;// b > a : : t1 =time(NULL); : : while (b > a) { : : a++; : : b= a + 1; : : } : : // b <= a, why??? : overflow 是原因, : 但是,+2147483647 + 1 --> 為何會變成 : -2147483648, 並沒有解釋清楚 : 所謂的 XX, XX 是 : 必須解釋 1's 補數, 2's 補數 C 規定 overflow 的結果為 undefined behavior 除了因為 interger type 不一定使用 2's complement 還有一個重要理由,那就是允許 compiler 做一些超乎想像的最佳化 姑且先退一萬步 我就拿我家裡的 GCC 4.7 on Linux x86_64 來舉例好了 在這平台上 int 是 32bit 沒有 padding 而且使用 2's complement 這應該算是非常普遍大家熟到不能再熟的環境了 然後上面那個 while 迴圈經過 -O3 最佳化後 你知道變成什麼指令嗎? 結果是這樣: .L2: jmp .L2 是的,就是一個無窮迴圈 因為 compiler 發現在不造成 overflow 的情況下 b 永遠比 a 大 所以直接代換成無窮迴圈 而這是正確的 compiler 行為,因為 overflow 的結果為未定義 因此產生無窮迴圈也是標準允許的結果 如果你沒有教導初學者這件事 那就是在陷害他們 讓他們以後打開 -O3 的時候遇到難以理解的 bug : : t2= time(NULL); : : // print a, b, (b > a) : : // print (t2 - t1) : : 在數學上,(a + 1) 永遠 大於 a : : 所以, 上面的 while, 會是一個 無窮迴圈, : : 但是, 上面的迴圈,大概 七秒鐘左右就會結束, : : 出來的 a, b 的答案是多少? why??? : : 如果想要讓時間的計算能夠更精確, : : 該如何處理? : : sjgau4311@gmail.com : clock() 是可以,但是 不夠好 : 比較好的是 ftime() http://linux.die.net/man/3/ftime This function is obsolete. Don't use it. If the time in seconds suffices, time(2) can be used; gettimeofday(2) gives microseconds; clock_gettime(2) gives nanoseconds but is not as widely available. : 當你的心中充滿垃圾,你看到的別人就是 垃圾, : 當你的心中充滿聖靈,你看到的別人都是 佛陀。 : 願大家都是 佛陀 小學而大遺,吾未見其明也。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.135.3.139

06/24 20:16, , 1F
推,我覺得這才是正確的觀念。
06/24 20:16, 1F

06/24 20:16, , 2F
其實我還滿好奇int overflow有什麼實務上的用法
06/24 20:16, 2F

06/24 20:16, , 3F
一般要爆數值都用unsigned,沒有overflow的問題
06/24 20:16, 3F

06/24 20:17, , 4F
不要用來毀滅宇宙就好了XD
06/24 20:17, 4F

06/24 20:17, , 5F
在我的概念中int overflow就是程式出bug了
06/24 20:17, 5F

06/24 20:23, , 6F
推!
06/24 20:23, 6F

06/24 20:27, , 7F
06/24 20:27, 7F

06/24 20:39, , 8F
overflow都是在wargame中遇到吧xD
06/24 20:39, 8F

06/24 20:50, , 9F
讚。
06/24 20:50, 9F

06/24 21:05, , 10F
推...
06/24 21:05, 10F

06/24 21:18, , 11F
打的好
06/24 21:18, 11F

06/24 21:51, , 12F
06/24 21:51, 12F

06/24 21:53, , 13F
06/24 21:53, 13F

06/24 23:39, , 14F
推!!!
06/24 23:39, 14F

06/25 02:36, , 15F
佩服推!
06/25 02:36, 15F

06/25 02:52, , 16F
唉,sjgau 真的是少數「熱心有餘,能力不足」的好人
06/25 02:52, 16F

06/25 02:52, , 17F
以前看漫畫,有一種人是超愛幫助人,但被幫助的都會倒楣...
06/25 02:52, 17F

06/25 02:53, , 18F
我覺得 s 版友應該是這種漫畫人物的具現體吧..
06/25 02:53, 18F

06/25 03:15, , 19F
好猛喔lol
06/25 03:15, 19F

06/25 08:20, , 20F
前一篇內容是什麼, 沒跟到
06/25 08:20, 20F

06/25 09:21, , 21F
overflow就單純最高位元進位捨棄而已
06/25 09:21, 21F

06/25 12:27, , 22F
06/25 12:27, 22F

06/25 14:29, , 23F
我的 gcc 4.6.3, Linux 3.2 x86, 用 -O2 就得到無窮迴圈了
06/25 14:29, 23F

06/25 15:13, , 24F
推高手分享知識
06/25 15:13, 24F

06/26 05:42, , 25F
此篇正解 詳情請看原PO寫的 "C 語言常見誤解" 好看!!!
06/26 05:42, 25F

06/26 11:00, , 26F
其實寫asm還蠻常利用overflow的...所以很多技巧在C上就被
06/26 11:00, 26F

06/26 11:01, , 27F
編譯器最佳化幹掉了而出現bug
06/26 11:01, 27F

06/27 02:42, , 28F
推:)
06/27 02:42, 28F

06/27 11:41, , 29F
06/27 11:41, 29F

06/27 23:53, , 30F
06/27 23:53, 30F

06/30 18:23, , 31F
大推!
06/30 18:23, 31F

07/02 01:52, , 32F
推~
07/02 01:52, 32F

07/12 19:23, , 33F
朝聖! 很多人喜歡用經驗法則來講解 但實際上很多是未定義
07/12 19:23, 33F

07/12 19:23, , 34F
的行為 只是你 碰巧矇到而已...
07/12 19:23, 34F
文章代碼(AID): #1Ho3U1fD (C_and_CPP)