Re: [分享] 問題導向的 學習方式
※ 引述《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
06/24 20:16, 2F
→
06/24 20:16, , 3F
06/24 20:16, 3F
→
06/24 20:17, , 4F
06/24 20:17, 4F
→
06/24 20:17, , 5F
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
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
06/25 02:52, 16F
→
06/25 02:52, , 17F
06/25 02:52, 17F
→
06/25 02:53, , 18F
06/25 02:53, 18F
推
06/25 03:15, , 19F
06/25 03:15, 19F
推
06/25 08:20, , 20F
06/25 08:20, 20F
→
06/25 09:21, , 21F
06/25 09:21, 21F
推
06/25 12:27, , 22F
06/25 12:27, 22F
推
06/25 14:29, , 23F
06/25 14:29, 23F
推
06/25 15:13, , 24F
06/25 15:13, 24F
推
06/26 05:42, , 25F
06/26 05:42, 25F
推
06/26 11:00, , 26F
06/26 11:00, 26F
→
06/26 11:01, , 27F
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