看板 YOLO 關於我們 聯絡資訊
※ [本文轉錄自 Gossiping 看板 #1SFuJUH6 ] 作者: jserv (松鼠) 看板: 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 語言程式設計中,最為困難的地方,也就是「品味」。 考慮以下自給定的 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) { 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) 的法語拼寫。 在當時,Ariane 系列火箭承包了全球商業衛星的發射約 50% 的業務量,而人們萬萬沒想 到,Ariane 5 發射後 37 秒,升空到 4 公里處,火箭偏離預定飛行軌跡,解體並爆炸, 2 名法國士兵當場死亡。 失事調查報告指出:水平加速偵測儀傳了一個 64-bit 浮點數給電腦,但飛行電腦用 16-bit 有號整數來接受這個浮點數,很不巧傳來的數字大於 32767,發生溢位 (Overflow) 例外,這樣的軟體設計缺失很常見,但對 Ariane 5 來說,下場竟是火箭的推進向量噴嘴 忽然朝某個方向轉到底,在高速偏航後,最終火箭解體。 開發 Ariane 5 火箭的軟體工程師在前一代 Ariane 4 中,小心翼翼地確認數值分佈, 確保水平速率的數值絕不會超過 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]。 歡迎關注「你所不知道的 C 語言」系列講座: http://hackfoldr.org/dykc/ [1] https://www.ted.com/talks/linus_torvalds_the_mind_behind_linux Linus 在 2001 年之後幾乎就沒有公開演講,只接受訪談對話形式,這次在 TED 竟然出動了 TED 總監 Chris Anderson 來訪談,可能是頭一遭 [2] https://zh.wikipedia.org/wiki/%E7%BD%A9%E6%9D%AF [3] https://hackmd.io/s/B1eo44C1- [4] https://hackmd.io/s/BkRKhQGae [5] https://hackmd.io/s/SkE33UTHf [6] https://hackmd.io/s/H19V4eyfV -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.116.82.61 ※ 文章網址: https://www.ptt.cc/bbs/Gossiping/M.1547666654.A.446.html
rockieloser: 推 01/17 03:24
sammoon: 趕快推 01/17 03:26
Turas: 趁早 01/17 03:27
pipi8696044: 116 01/17 03:27
jhjhs33504: 五推內 01/17 03:27
siscon: 哇賽 01/17 03:28
HateAnus: 十推 01/17 03:28
cip604: 推 01/17 03:28
dklash: 只能推了... 01/17 03:29
blue999: 說中文 01/17 03:31
ohsuoh: 笑了 01/17 03:31
jserv: @blue999, 請問哪段的中文表達不清楚呢? 01/17 03:31
IsMe5566: 釣到大神了 01/17 03:32
POCARI5566: 有神快拜 01/17 03:33
water200427: 這不管嗑了什麼,都給我來一點 01/17 03:33
raagi: 推 老師是不是壓力大 01/17 03:33
jhjhs33504: 後半牽涉到計算機組織的部分略嫌草率 01/17 03:35
Noxves: 推 01/17 03:36
jserv: @raagi, 我面臨的壓力約 101.325 kPa (標準 1 大氣壓) 01/17 03:36
jserv: @jhjhs33504, 感謝鞭策!表示之後我可以繼續回文補充 01/17 03:37
buckle: 推 01/17 03:38
b0920075: 真的嗑很多...推 01/17 03:38
WYchuang: 有人說C++現在很爛 不知道大神的看法如何 01/17 03:42
ap954212: 老師早點睡 01/17 03:42
kiwi0530: 老師辛苦了,這麼晚還沒睡 01/17 03:43
jserv: @kiwi0530, 又到選課時間,怕課堂學生不夠,上來打廣告 01/17 03:44
f1256421: 我有推薦學弟妹去修 也有幫忙在低卡打廣告ㄛ 01/17 03:53
wenmilkyway: 文組QQ 01/17 03:54
takechance: 文組路過,反正就是理組無能讓火箭爆掉的對吧 01/17 03:58
owlonoak: 請問可以在哪上你的課阿 01/17 04:00
ninjahatoru: jserv! 01/17 04:02
waeshine: 推推 01/17 04:03
jserv: @takechance, 與其說「無能」,不如說現在工程挑戰已超出 01/17 04:07
jserv: 人們預期太多,而且隨著自動駕駛、遠距醫療手術,和通訊 01/17 04:08
jellyfishuan: 如果兩年前我是這樣入門的話 QQ 01/17 04:08
jserv: 系統大幅仰賴著複雜的軟體,挑戰更加嚴苛 01/17 04:08
brad001: 希望大三大四後能修教授的課 覺得自己實力不夠不敢選那堂 01/17 04:09
brad001: QQ 01/17 04:09
hizuki: gcc對強制轉換都有檢查了 01/17 04:09
jserv: 不過也不用杞人憂天,許多軟體工程師的創作在被大規模採納 01/17 04:10
jserv: 之前,就被宣布報銷了 (特別是台灣軟體工程師...) 01/17 04:10
shawnfu: 看到一堆pointer就頭痛, 還好不寫底層 01/17 04:11
doggying123: 推 01/17 04:12
jserv: @brad001, 有體力有決心就可以來 :-) 01/17 04:13
nonsu: 推 01/17 04:14
victoryzy: 跟著老師學好C語言有機會征服C罩杯嗎QQ 01/17 04:14
jserv: @victoryzy, 其實我是先征服C罩杯,然後才發現掌握C語言 01/17 04:15
jserv: 所以我讀 C 語言規格書時,對 data type 特別有感啊 01/17 04:15
bigrange: 老師接下來可以跳戰D罩杯了 01/17 04:17
jserv: @shawnfu, 以K&R C為例,許多人聞風喪膽的指標一直到該書的 01/17 04:17
jserv: 第 5 章,約全書一半才提到。可解讀為「你可以在不懂指標是 01/17 04:17
jserv: 什麼之前,仍可掌握多數的 C 語言功能」 01/17 04:18
jserv: @bigrange, 合用最重要,老婆哺乳漲得辛苦 01/17 04:20
jserv: @owlonoak, http://wiki.csie.ncku.edu.tw/User/jserv # 01/17 04:24
jserv: 上方連結有實體課程和線上講座的清單 01/17 04:25
revorea: 努...努力抽出時間把低級C語言學好中 01/17 04:32
hackerman: 每次看到得跪,腿好酸... 01/17 04:45
notneme159: 推個 完全看不懂 01/17 04:48
u9914014: 推 01/17 04:49
ZhouGongJin: 居……居然上鉤了 01/17 04:55
nanozako: 嗯 懂個5趴左右 01/17 04:57
gaduoray: 推一下 免得別人以為我看不懂 01/17 04:59
lala86591: Hello world 01/17 05:00
scottshai: 請問最近 systemd v240 的 systemd-journald exploit 01/17 05:10
thcb3181: 大神~ 01/17 05:13
scottshai: 這類透過 stack overflow 的攻擊能夠從程式裡面防範嗎 01/17 05:14
bewilderment: XD 01/17 05:14
scottshai: 還是都使用 GCC 的 -fstack-clash-protection 編譯就好 01/17 05:15
ttff: 真神人也... 01/17 05:26
alan23273850: 原來 linked list 可以從 10 行精簡為 4 行阿...... 01/17 05:37
alan23273850: 真是長知識了,從來都不知道 C 語言可以那麼美,就 01/17 05:38
alan23273850: 跟C罩杯一樣(誤),只是一下&一下*的看得豆頁女子痛. 01/17 05:39
kinomon: 笑死 01/17 05:45
q10242: 推 01/17 06:04
a2470abc: 先推大神 不知道最近嗑了什麼超純的 01/17 06:23
abc88662a: 先跪 嗚嗚嗚 jserv我推不上成大QQ 01/17 06:27
cool9203: 推老師QQ成大資工所有得上老師開的系統類的課嗎QQ 01/17 06:29
coolda: 推 01/17 06:39
rex44391: 推 01/17 06:55
TrevorStory: 長知識了 01/17 07:01
fwfly: 有神快拜 01/17 07:24
will1118: 老師好 01/17 07:25
heary: 推 01/17 07:25
Kerry: 推 01/17 07:36
CaptainTeemo: 太久沒用 C 惹,那四行想了一下 01/17 07:37
hotrain13: 大神出來了 01/17 07:37
jerry0715no1: 老師好 01/17 07:40
max0616: 推 01/17 07:45
Donaldren: 推 01/17 07:46
shunchao: 01/17 07:49
silentduke: 推 01/17 07:49
bala73: 有神快拜 01/17 07:51
ljsnonocat2: 01/17 07:53
gowellplayer: 讚 01/17 07:56
cons: 推 01/17 08:06
devilkool: 是大神 01/17 08:06
chps920281: 推 01/17 08:09
stw0975: 推 01/17 08:11
phubber: 推 01/17 08:11
pleasewait: jserv! 01/17 08:14
mamaka: 推 01/17 08:15
edward811022: 先推再說 01/17 08:16
SiFox: 推,我也要嗑 01/17 08:16
lookto: 推 01/17 08:19
yihchii: 推 01/17 08:25
lpoijk: 我的媽呀是大神 還很認真的回了廢文XDD 01/17 08:25
MattOwl: 讚 01/17 08:29
ji3g4m0: 我媽問我為什麼跪著打字 01/17 08:30
uonyang: 有神快拜…樓下快跪 01/17 08:30
DWR: 什麼東西啦 有神快推 01/17 08:34
gugugaga: 為什麼刪除節點不用free掉啊 01/17 08:37
fuga0000: 推 01/17 08:38
ssccg: remove是把節點從list上拿掉,還沒有確定要刪掉節點 01/17 08:41
minimax76715: 有神快拜 01/17 08:44
kig88: 快拜 01/17 08:45
loona: 難個屁 學店仔 01/17 08:45
loona: 噓錯人 推回來 01/17 08:47
crazywolf: 哇,雖然看不懂還是推一下 01/17 08:47
perytech: 好文推! 01/17 08:49
BinJohn5566: 推 01/17 08:51
lwrwang: 神人快拜 01/17 08:54
vi000246: 我還是寫寫出bug不會死人的程式碼就好 01/17 09:05
CoolboyLinya: 看無 01/17 09:07
chang564: 朝聖 01/17 09:07
e00291001: 參見大神 01/17 09:15
yluok: 推 01/17 09:15
dmmsiang: 推 01/17 09:15
rum579: 推 01/17 09:16
abb123456: 推 01/17 09:18
jackwula9211: 太久沒碰C都快看不懂了,大神降臨 01/17 09:20
vn509942: 大神 01/17 09:20
abc53: 推 01/17 09:22
legendd: 朝聖個 01/17 09:23
jitaomef: 推 01/17 09:32
youjan: 快推 01/17 09:36
cphs102007: 蛤 01/17 09:37
VIGUTA: 腦幹中 我想我這輩子永遠搞不懂指指標了 01/17 09:39
tyr2004: 推 01/17 09:40
Wand: 哈哈,大師早 01/17 09:43
gs8613789: 拜一下 01/17 09:46
TitanEric: 推唷 01/17 09:57
hotsizzle: 跪推 01/17 09:57
terryshu: 以跪 01/17 09:57
Euteamo: 推 01/17 10:04
qwer338859: 神 01/17 10:05
jserv: @loona, 我讀學店、我在學店教書,我驕傲! 01/17 10:09
jserv: @vi000246, 可是這樣的存在感就很低,咱們工程師要做大事的 01/17 10:09
jserv: @ssccg, 感謝澄清,上面我提及的操作應拆解為 remove (移除 01/17 10:14
jserv: 指定節點在 linked list 的連結) 和 reclamation (實際收回 01/17 10:15
jserv: 不再連結的記憶體空間,如網友提到的呼叫 free) 01/17 10:16
jserv: @lpoijk, 身處台灣最好的學店,當然要發廢文啊 01/17 10:19
jserv: @alan23273850, 任何領域追求極致的過程,都有「美」的成分 01/17 10:20
jserv: @cool9203, 歡迎訂閱線上講座 YouTube 頻道 (.GUTS) 01/17 10:21
tim0922: 不管怎樣 我先跪了 01/17 10:21
ck237: 看不懂 01/17 10:23
david220: XD 01/17 10:29
KLSAKKOCK: 推 01/17 10:31
mmc109815038: 看不懂 可是淚推 01/17 10:31
jserv: @mmc109815038, Linus舉出的程式碼就跟詩經一樣精簡又富有 01/17 10:33
love5566fan: 116 01/17 10:33
jserv: 情感。我學中文好多年,至今仍是很難掌握,程式語言也如是 01/17 10:36
xhung: 推推推 要不然別人以為我看不懂 XD 01/17 10:37
v86861062: :) 01/17 10:47
leo80042: 推 01/17 11:06
zu00405479: 老師請問半路出家的要怎麼讓基礎更扎實? QQ 01/17 11:10
charlly: 頭痛 01/17 11:15
kuanyuu: 老師好! 01/17 11:16
KaryuuIssen: 移除時不用考慮找不到節點的情況嗎 01/17 11:18
Mood10207: 專業推@@! 01/17 11:24
a23460701: 推推松鼠 01/17 11:24
Lpll: 老師又出來拉高八卦的智商了QQ 01/17 11:26
heaviest: 推,希望有緣去成大上老師的課 01/17 11:41
Cybershit: 半夜不睡在發廢文 01/17 11:45
penta: 老師救我啊啊啊啊 01/17 11:45
maxxpme: 推 01/17 12:11
ikenaka: 116 01/17 12:15
he02789222: 117樓笑死ww jserv只能跪<(_ _)> 01/17 12:15
jetcoco: 嗯嗯 和我想的一樣 01/17 12:32
bij831: 說中文啊我看不懂 01/17 12:32
fg008kimo: 這來源解說得不錯 長知識 01/17 12:38
bassplayer: 優質文! 01/17 12:41
hohamita: 老師 程式碼的可讀性跟精簡程度要怎麼取捨呢 01/17 12:45
CrazyBug: Linked list都忘光惹 01/17 12:49
bbo6uis122: 推 01/17 12:54
xiefengan: 推 01/17 13:00
zoidsa12101: C語言都快忘了 01/17 13:06
OFAlpaca: 當初看到Linus的版本真的覺得很神奇 01/17 13:15
bridgepons: 神 01/17 13:54
Rapsody: 葛根: 解"肌"退熱 謝謝 01/17 14:49
j900155: 拜神 01/17 16:22
a9233085: https://i.imgur.com/VuiZrxn.jpg 01/17 17:36
Cyuhsuan: Push 01/17 19:02
yangbob1203: 希望畢業前有機會修老師的課 01/17 19:30
a5245242003: 請不會認真回廢文 01/17 20:56
aa85ss20: 老師! 01/17 20:58
※ 發信站: 批踢踢實業坊(ptt.cc) ※ 轉錄者: okcool (1.171.52.12), 01/17/2019 21:20:29