※ 本文為 MindOcean 轉寄自 ptt.cc 更新時間: 2019-01-18 06:39:47
看板 Gossiping
作者 標題 Re: [問卦] C語言最難的部分是哪一個
時間 Thu Jan 17 03:24:08 2019
※ 引述《yuponkimo (皇甫尊)》之銘言:
: 內葛,
(學期即將結束,我終於有空上來發廢文了)
葛,是豆科多年生草本植物,莖長二、三丈,纏繞他物上,花紫紅色。用途多樣,
莖可編籃做繩,纖維可織葛布。根可提製澱粉,又供藥用。葛根,能解饑退熱,
治高血壓、頸項強痛、冠心病等。
《詩經.國風.周南.葛覃》開頭寫道「葛之覃兮,施于中谷,維葉萋萋」,意思是
長長的葛藤生長,蔓延到谷中,伴隨著茂盛的葉子。兄台用「葛」來點題,訴說 C
語言近 50 年歷久彌新的發展,實在高竿啊!
: 我自己覺得是Linked list啦,
: 射來射去的豆頁真的疼,
: 花了好長時間才寫出一題來,
: 好好的structure為什麼要再加上指到自己的指標呢?
這裡又用「豆」提醒大家,「葛」屬於豆科,用心良苦。
Linux 核心之父 Linus Torvalds 在 TED 2016 的訪談 [1] 中,用 linked list 程式碼
作為解說「程式設計的品味」,在有限的訪談中,Linus 不去解釋程式碼的運作,而僅用
程式碼的長度變化,讓會眾體驗到「一個目的有著多條路徑,但我們該如何取捨呢?」,
我想,這也是 C 語言程式設計中,最為困難的地方,也就是「品味」。
程式碼的長度變化,讓會眾體驗到「一個目的有著多條路徑,但我們該如何取捨呢?」,
我想,這也是 C 語言程式設計中,最為困難的地方,也就是「品味」。
考慮以下自給定的 linked list 中刪去特定節點的程式碼: (佔用 10 行)
void remove_list_node(List *list, Node *target) {
Node *prev = NULL;
Node *current = list->head;
while (current != target) {
prev = current;
current = current->next;}
if (!prev)
list->head = target->next;
else
prev->next = target->next;
}
但 Linus 說,其實可改寫為以下功能一致,但更有「品味」的實作: (僅用 4 行)
void remove_list_node(List *list, Node *target) {
Node **indirect = &list->head;
while (*indirect != target)
indirect = &(*indirect)->next;
*indirect = target->next;
}
上述程式碼從「要更新什麼位置的資料」思考,無論是 head 或者非 head,更新的是
同一類型的資料,不用特別操作,自然省下額外的處理。
也許你會好奇,那麼新增節點的程式碼是否也可運用類似技巧呢?當然可以!請見以下:
void insert_list_node(List **head, int val) {
void insert_list_node(List **head, int val) {
while (*head) {
head = &((*head)->next);
}
*head = calloc(1, sizeof(List));
(*head)->val = val;
}
要掌握這樣的「品味」之前,務必先征服 C 罩杯。依據 Wikipedia 的解說 [2]:
> 根據製造商的不同,版型可能有所不同因而穿著效果上有所差異。
> 罩杯尺寸大致是下列公式換算可得知:罩杯尺寸 = 上胸圍 - 下胸圍
上述「上圍」和「下圍」就對應到 C 語言規格的 data type,而在 C 語言中基礎運算
型態和對應修飾字均有資料範圍規範,千萬不要小看數值範圍對程式設計的影響,傾家
蕩產或國破家亡都有可能。
型態和對應修飾字均有資料範圍規範,千萬不要小看數值範圍對程式設計的影響,傾家
蕩產或國破家亡都有可能。
1996 年 6 月 4 日,在風和日麗的法屬蓋亞那太空中心 (法文: Centre Spatial
Guyanais),歐洲太空總署發射了一艘名為 Ariane 5 的火箭,預計運送 4 顆太陽風觀察
衛星到軌道。火箭本身加上載運的人造衛星及科學儀器值 USD 7.5 billion (台幣約2250
億)。Ariane 名稱來源於神話人物阿麗雅杜妮 (Ariadne) 的法語拼寫。
衛星到軌道。火箭本身加上載運的人造衛星及科學儀器值 USD 7.5 billion (台幣約2250
億)。Ariane 名稱來源於神話人物阿麗雅杜妮 (Ariadne) 的法語拼寫。
在當時,Ariane 系列火箭承包了全球商業衛星的發射約 50% 的業務量,而人們萬萬沒想
到,Ariane 5 發射後 37 秒,升空到 4 公里處,火箭偏離預定飛行軌跡,解體並爆炸,
2 名法國士兵當場死亡。
失事調查報告指出:水平加速偵測儀傳了一個 64-bit 浮點數給電腦,但飛行電腦用
16-bit 有號整數來接受這個浮點數,很不巧傳來的數字大於 32767,發生溢位 (Overflow)
例外,這樣的軟體設計缺失很常見,但對 Ariane 5 來說,下場竟是火箭的推進向量噴嘴
忽然朝某個方向轉到底,在高速偏航後,最終火箭解體。
開發 Ariane 5 火箭的軟體工程師在前一代 Ariane 4 中,小心翼翼地確認數值分佈,
確保水平速率的數值絕不會超過 16-bit 表達範圍以外。這些工程師在 Ariane 5 系統
沿用這段程式碼,卻沒有檢查前述假設是否符合新的設計。
確保水平速率的數值絕不會超過 16-bit 表達範圍以外。這些工程師在 Ariane 5 系統
沿用這段程式碼,卻沒有檢查前述假設是否符合新的設計。
上述 Ariane 5 火箭事故對應的展示用 C 語言程式如下:
void show_info(double d, int16_t n) {
n = (int16_t) d;
printf("d = %f, n = %d \n", d, n);}
int main() {
double d1 = 32767.0, d2 = 32768.0;
int16_t n = 0;
show_info(d1, n); show_info(d2, n);
return(0);
}
第 1 個輸出是 n = 32767; 第 2 個輸出則是 n = -32768
差之毫釐,失之千里!
更多這類軟體缺失造成巨大危害的案例可見 [3],問題的根源竟然是「沒掌握好罩杯」,
你說,是不是該誠實面對自己,學好數值系統呢?可參照線上講座 [4]
回到之前提及的 linked list,這不全然是資料結構相關議題,在真實世界中,我們還要
討論這類非連續記憶體的資料操作效率和正確性,尤其是 Throughput (吞吐量; 單位時
間內可處理多少的資料量) 和 Scalability (擴展性; 隨著硬體資源的投入,可處理越來
越多的資料或工作時的能力或潛力),相當值得大書特書,可參見線上講座 [5] [6]。
討論這類非連續記憶體的資料操作效率和正確性,尤其是 Throughput (吞吐量; 單位時
間內可處理多少的資料量) 和 Scalability (擴展性; 隨著硬體資源的投入,可處理越來
越多的資料或工作時的能力或潛力),相當值得大書特書,可參見線上講座 [5] [6]。
歡迎關注「你所不知道的 C 語言」系列講座: http://hackfoldr.org/dykc/
[1] https://www.ted.com/talks/linus_torvalds_the_mind_behind_linux
Linus Torvalds: The mind behind Linux | TED Talk
Linus Torvalds transformed technology twice -- first with the Linux kernel, which helps power the Internet, and again with Git, the source code manage ...
Linus Torvalds transformed technology twice -- first with the Linux kernel, which helps power the Internet, and again with Git, the source code manage ...
竟然出動了 TED 總監 Chris Anderson 來訪談,可能是頭一遭
[2] https://zh.wikipedia.org/wiki/罩杯
[3] https://hackmd.io/s/B1eo44C1-
你所不知道的C語言: linked list 和非連續記憶體操作 - HackMD
# [你所不知道的C語言]( linked list 和非連續記憶體操作 Copyright (**慣C**) 2018 [宅色夫](htt ...
# [你所不知道的C語言]( linked list 和非連續記憶體操作 Copyright (**慣C**) 2018 [宅色夫](htt ...
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.116.82.61
※ 文章代碼(AID): #1SFuJUH6 (Gossiping)
※ 文章網址: https://www.ptt.cc/bbs/Gossiping/M.1547666654.A.446.html
推 : 推1F 01/17 03:24
推 : 趕快推2F 01/17 03:26
推 : 趁早3F 01/17 03:27
推 : 1164F 01/17 03:27
推 : 五推內5F 01/17 03:27
推 : 哇賽6F 01/17 03:28
推 : 十推7F 01/17 03:28
推 : 推8F 01/17 03:28
推 : 只能推了...9F 01/17 03:29
噓 : 說中文10F 01/17 03:31
推 : 笑了11F 01/17 03:31
→ : @blue999, 請問哪段的中文表達不清楚呢?12F 01/17 03:31
推 : 釣到大神了13F 01/17 03:32
推 : 有神快拜14F 01/17 03:33
推 : 這不管嗑了什麼,都給我來一點15F 01/17 03:33
推 : 推 老師是不是壓力大16F 01/17 03:33
→ : 後半牽涉到計算機組織的部分略嫌草率17F 01/17 03:35
推 : 推18F 01/17 03:36
→ : @raagi, 我面臨的壓力約 101.325 kPa (標準 1 大氣壓)19F 01/17 03:36
→ : @jhjhs33504, 感謝鞭策!表示之後我可以繼續回文補充
→ : @jhjhs33504, 感謝鞭策!表示之後我可以繼續回文補充
推 : 推21F 01/17 03:38
推 : 真的嗑很多...推22F 01/17 03:38
Jim Huang
@jserv我接觸過 C 語言、C 罩杯、C-class (賓士),此生無憾了
@jserv我接觸過 C 語言、C 罩杯、C-class (賓士),此生無憾了
推 : 有人說C++現在很爛 不知道大神的看法如何24F 01/17 03:42
推 : 老師早點睡25F 01/17 03:42
推 : 老師辛苦了,這麼晚還沒睡26F 01/17 03:43
→ : @kiwi0530, 又到選課時間,怕課堂學生不夠,上來打廣告27F 01/17 03:44
推 : 我有推薦學弟妹去修 也有幫忙在低卡打廣告ㄛ28F 01/17 03:53
推 : 文組QQ29F 01/17 03:54
→ : 文組路過,反正就是理組無能讓火箭爆掉的對吧30F 01/17 03:58
推 : 請問可以在哪上你的課阿31F 01/17 04:00
推 : jserv!32F 01/17 04:02
推 : 推推33F 01/17 04:03
→ : @takechance, 與其說「無能」,不如說現在工程挑戰已超出34F 01/17 04:07
→ : 人們預期太多,而且隨著自動駕駛、遠距醫療手術,和通訊
→ : 人們預期太多,而且隨著自動駕駛、遠距醫療手術,和通訊
推 : 如果兩年前我是這樣入門的話 QQ36F 01/17 04:08
→ : 系統大幅仰賴著複雜的軟體,挑戰更加嚴苛37F 01/17 04:08
推 : 希望大三大四後能修教授的課 覺得自己實力不夠不敢選那堂38F 01/17 04:09
→ : QQ
推 : gcc對強制轉換都有檢查了40F 01/17 04:09
→ : 不過也不用杞人憂天,許多軟體工程師的創作在被大規模採納41F 01/17 04:10
→ : 之前,就被宣布報銷了 (特別是台灣軟體工程師...)
→ : 之前,就被宣布報銷了 (特別是台灣軟體工程師...)
→ : 看到一堆pointer就頭痛, 還好不寫底層43F 01/17 04:11
推 : 推44F 01/17 04:12
→ : @brad001, 有體力有決心就可以來 :-)45F 01/17 04:13
推 : 推46F 01/17 04:14
推 : 跟著老師學好C語言有機會征服C罩杯嗎QQ47F 01/17 04:14
→ : @victoryzy, 其實我是先征服C罩杯,然後才發現掌握C語言48F 01/17 04:15
→ : 所以我讀 C 語言規格書時,對 data type 特別有感啊
→ : 所以我讀 C 語言規格書時,對 data type 特別有感啊
推 : 老師接下來可以跳戰D罩杯了50F 01/17 04:17
→ : @shawnfu, 以K&R C為例,許多人聞風喪膽的指標一直到該書的51F 01/17 04:17
→ : 第 5 章,約全書一半才提到。可解讀為「你可以在不懂指標是
→ : 什麼之前,仍可掌握多數的 C 語言功能」
→ : @bigrange, 合用最重要,老婆哺乳漲得辛苦
→ : @owlonoak, http://wiki.csie.ncku.edu.tw/User/jserv #
→ : 第 5 章,約全書一半才提到。可解讀為「你可以在不懂指標是
→ : 什麼之前,仍可掌握多數的 C 語言功能」
→ : @bigrange, 合用最重要,老婆哺乳漲得辛苦
→ : @owlonoak, http://wiki.csie.ncku.edu.tw/User/jserv #
→ : 上方連結有實體課程和線上講座的清單56F 01/17 04:25
推 : 努...努力抽出時間把低級C語言學好中57F 01/17 04:32
推 : 每次看到得跪,腿好酸...58F 01/17 04:45
推 : 推個 完全看不懂59F 01/17 04:48
推 : 推60F 01/17 04:49
推 : 居……居然上鉤了61F 01/17 04:55
推 : 嗯 懂個5趴左右62F 01/17 04:57
推 : 推一下 免得別人以為我看不懂63F 01/17 04:59
推 : Hello world64F 01/17 05:00
推 : 請問最近 systemd v240 的 systemd-journald exploit65F 01/17 05:10
推 : 大神~66F 01/17 05:13
推 : 這類透過 stack overflow 的攻擊能夠從程式裡面防範嗎67F 01/17 05:14
推 : XD68F 01/17 05:14
→ : 還是都使用 GCC 的 -fstack-clash-protection 編譯就好69F 01/17 05:15
推 : 真神人也...70F 01/17 05:26
推 : 原來 linked list 可以從 10 行精簡為 4 行阿......71F 01/17 05:37
→ : 真是長知識了,從來都不知道 C 語言可以那麼美,就
→ : 跟C罩杯一樣(誤),只是一下&一下*的看得豆頁女子痛.
→ : 真是長知識了,從來都不知道 C 語言可以那麼美,就
→ : 跟C罩杯一樣(誤),只是一下&一下*的看得豆頁女子痛.
推 : 笑死74F 01/17 05:45
推 : 推75F 01/17 06:04
推 : 先推大神 不知道最近嗑了什麼超純的76F 01/17 06:23
推 : 先跪 嗚嗚嗚 jserv我推不上成大QQ77F 01/17 06:27
推 : 推老師QQ成大資工所有得上老師開的系統類的課嗎QQ78F 01/17 06:29
推 : 推79F 01/17 06:39
推 : 推80F 01/17 06:55
推 : 長知識了81F 01/17 07:01
推 : 有神快拜82F 01/17 07:24
推 : 老師好83F 01/17 07:25
推 : 推84F 01/17 07:25
推 : 推85F 01/17 07:36
推 : 太久沒用 C 惹,那四行想了一下86F 01/17 07:37
推 : 大神出來了87F 01/17 07:37
推 : 老師好88F 01/17 07:40
推 : 推89F 01/17 07:45
推 : 推90F 01/17 07:46
推 :91F 01/17 07:49
推 : 推92F 01/17 07:49
推 : 有神快拜93F 01/17 07:51
推 :94F 01/17 07:53
推 : 讚95F 01/17 07:56
推 : 推96F 01/17 08:06
推 : 是大神97F 01/17 08:06
推 : 推98F 01/17 08:09
推 : 推99F 01/17 08:11
推 : 推100F 01/17 08:11
推 : jserv!101F 01/17 08:14
推 : 推102F 01/17 08:15
推 : 先推再說103F 01/17 08:16
推 : 推,我也要嗑104F 01/17 08:16
推 : 推105F 01/17 08:19
推 : 推106F 01/17 08:25
推 : 我的媽呀是大神 還很認真的回了廢文XDD107F 01/17 08:25
推 : 讚108F 01/17 08:29
推 : 我媽問我為什麼跪著打字109F 01/17 08:30
推 : 有神快拜…樓下快跪110F 01/17 08:30
推 : 什麼東西啦 有神快推111F 01/17 08:34
推 : 為什麼刪除節點不用free掉啊112F 01/17 08:37
推 : 推113F 01/17 08:38
→ : remove是把節點從list上拿掉,還沒有確定要刪掉節點114F 01/17 08:41
推 : 有神快拜115F 01/17 08:44
推 : 快拜116F 01/17 08:45
噓 : 難個屁 學店仔117F 01/17 08:45
推 : 噓錯人 推回來
推 : 噓錯人 推回來
推 : 哇,雖然看不懂還是推一下119F 01/17 08:47
推 : 好文推!120F 01/17 08:49
推 : 推121F 01/17 08:51
推 : 神人快拜122F 01/17 08:54
推 : 我還是寫寫出bug不會死人的程式碼就好123F 01/17 09:05
推 : 看無124F 01/17 09:07
推 : 朝聖125F 01/17 09:07
推 : 參見大神126F 01/17 09:15
推 : 推127F 01/17 09:15
推 : 推128F 01/17 09:15
推 : 推129F 01/17 09:16
推 : 推130F 01/17 09:18
推 : 太久沒碰C都快看不懂了,大神降臨131F 01/17 09:20
推 : 大神132F 01/17 09:20
推 : 推133F 01/17 09:22
推 : 朝聖個134F 01/17 09:23
推 : 推135F 01/17 09:32
推 : 快推136F 01/17 09:36
推 : 蛤137F 01/17 09:37
推 : 腦幹中 我想我這輩子永遠搞不懂指指標了138F 01/17 09:39
推 : 推139F 01/17 09:40
推 : 哈哈,大師早140F 01/17 09:43
推 : 拜一下141F 01/17 09:46
推 : 推唷142F 01/17 09:57
推 : 跪推143F 01/17 09:57
推 : 以跪144F 01/17 09:57
推 : 推145F 01/17 10:04
推 : 神146F 01/17 10:05
→ : @loona, 我讀學店、我在學店教書,我驕傲!147F 01/17 10:09
→ : @vi000246, 可是這樣的存在感就很低,咱們工程師要做大事的
→ : @ssccg, 感謝澄清,上面我提及的操作應拆解為 remove (移除
→ : 指定節點在 linked list 的連結) 和 reclamation (實際收回
→ : 不再連結的記憶體空間,如網友提到的呼叫 free)
→ : @lpoijk, 身處台灣最好的學店,當然要發廢文啊
→ : @alan23273850, 任何領域追求極致的過程,都有「美」的成分
→ : @cool9203, 歡迎訂閱線上講座 YouTube 頻道 (.GUTS)
→ : @vi000246, 可是這樣的存在感就很低,咱們工程師要做大事的
→ : @ssccg, 感謝澄清,上面我提及的操作應拆解為 remove (移除
→ : 指定節點在 linked list 的連結) 和 reclamation (實際收回
→ : 不再連結的記憶體空間,如網友提到的呼叫 free)
→ : @lpoijk, 身處台灣最好的學店,當然要發廢文啊
→ : @alan23273850, 任何領域追求極致的過程,都有「美」的成分
→ : @cool9203, 歡迎訂閱線上講座 YouTube 頻道 (.GUTS)
推 : 不管怎樣 我先跪了155F 01/17 10:21
推 : 看不懂156F 01/17 10:23
推 : XD157F 01/17 10:29
推 : 推158F 01/17 10:31
推 : 看不懂 可是淚推159F 01/17 10:31
→ : @mmc109815038, Linus舉出的程式碼就跟詩經一樣精簡又富有160F 01/17 10:33
推 : 116161F 01/17 10:33
→ : 情感。我學中文好多年,至今仍是很難掌握,程式語言也如是162F 01/17 10:36
推 : 推推推 要不然別人以為我看不懂 XD163F 01/17 10:37
推 : :)164F 01/17 10:47
推 : 推165F 01/17 11:06
推 : 老師請問半路出家的要怎麼讓基礎更扎實? QQ166F 01/17 11:10
推 : 頭痛167F 01/17 11:15
推 : 老師好!168F 01/17 11:16
推 : 移除時不用考慮找不到節點的情況嗎169F 01/17 11:18
推 : 專業推@@!170F 01/17 11:24
推 : 推推松鼠171F 01/17 11:24
推 : 老師又出來拉高八卦的智商了QQ172F 01/17 11:26
推 : 推,希望有緣去成大上老師的課173F 01/17 11:41
推 : 半夜不睡在發廢文174F 01/17 11:45
推 : 老師救我啊啊啊啊175F 01/17 11:45
推 : 推176F 01/17 12:11
推 : 116177F 01/17 12:15
推 : 117樓笑死ww jserv只能跪<(_ _)>178F 01/17 12:15
推 : 嗯嗯 和我想的一樣179F 01/17 12:32
推 : 說中文啊我看不懂180F 01/17 12:32
推 : 這來源解說得不錯 長知識181F 01/17 12:38
推 : 優質文!182F 01/17 12:41
推 : 老師 程式碼的可讀性跟精簡程度要怎麼取捨呢183F 01/17 12:45
推 : Linked list都忘光惹184F 01/17 12:49
推 : 推185F 01/17 12:54
推 : 推186F 01/17 13:00
推 : C語言都快忘了187F 01/17 13:06
推 : 當初看到Linus的版本真的覺得很神奇188F 01/17 13:15
推 : 神189F 01/17 13:54
→ : 葛根: 解"肌"退熱 謝謝190F 01/17 14:49
推 : 拜神191F 01/17 16:22
推 : Push193F 01/17 19:02
推 : 希望畢業前有機會修老師的課194F 01/17 19:30
推 : 請不會認真回廢文195F 01/17 20:56
推 : 老師!196F 01/17 20:58
※ okcool:轉錄至看板 YOLO 01/17 21:20
推 : 對不起 就算是溢位了也還活著 QQ197F 01/17 22:26
推 : 題外話 指標換掉前 記得要把memory還回去rrrrr198F 01/17 23:01
--
※ 看板: Gossiping 文章推薦值: 0 目前人氣: 0 累積人氣: 1386
1樓 時間: 2019-01-17 10:20:17 (台灣)
→
01-17 10:20 TW
程式不是愈短愈好,要簡潔,但要容易看,這樣才好維護! 太多的指標與reference 很容易造成日後維護的困難!
回列表(←)
分享