精華區beta C_Chat 關於我們 聯絡資訊
※ 引述《STAV72 (刁民黨黨務主委)》之銘言: : https://i.imgur.com/NLPJc6B.jpg : 科學家:讚啦!有用了! : 教授:很好,讓我們看看是如何作用跟怎麼作用! : 碼農:讚啦!跑起來了! : 主管:別再碰它,沒人知道會不會無預警當掉。 : 寫程式真的這麼邪門嗎? : 初五開工 這邊用C++給大家玩一個小遊戲 一個hello world等級的小程式 #include<iostream> using namespace std; int main() { int i = 1; cout << i++ <<" "<< i-- << " " << i--; return 0; } A得到結果: 1 2 1 B得到結果: -1 0 1 A的結果對於有C/C++基礎的人 蠻直覺的正確(?) 但是B怎麼感覺先做了兩次i--在輸出 https://i.imgur.com/ooLD9nN.png 思考一下 當你想要說標題上面說的"邪門" 現在我要告訴你 A用的可能是比較新的編譯器 B用的可能是比較舊的編譯器 並且運氣不好 如果B用的是比較舊的編譯器 並且運氣很好 他會得到跟A一樣的結果 因為 同行出現 i++ 與 i 與 << 的operator 此行為在C++17以前為: Undefined Behavior 簡稱UB 中文翻譯是"未定義"行為 但我們常稱UB 也就是語言規格書 沒有規範輸出結果會怎樣 所以會有怎樣的結果 全部由編譯器設計者團隊決定(或者無法決定) 今天這個例子 用白話文說就是: 同一行中 i++與i--與<< 的順序都沒有定義 由編譯器開發者決定 所以B今天從GCC改成Clang 且都是指定C++14或C++11或C++98的情況下 可能會得到一樣的結果 或者說B預期跟A結果一樣 比較符合直覺的 1 2 1 參考資料 有興趣可以去看看 [C++17規格書] https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4713.pdf [Jserv說UB,大推,也有YT影片] https://hackmd.io/@sysprog/c-undefined-behavior 以下實作收尾 GCC 6.3沒有完整的支援C++17 所以可能得到-1 0 1 這邊是B運氣不好的狀況 https://i.imgur.com/Y9KzLyY.png GCC 7.0以後完整的支援C++17 所以是符合預期的1 2 1 這邊可能是A的狀況 https://i.imgur.com/CoyEEU1.png 然後clang 5.3沒有完整的支援C++17 卻得到符合預期的1 2 1 並且有丟出警告 這邊可能是A的狀況 也可能是B運氣好的狀況 https://i.imgur.com/z0z125n.png 結論: 0. 其實不能說是邪門,是C++語言規格書沒有看完(?) 1. 歡迎加入clang/llvm的陣營 編譯器提示比較好 2. 請放棄C++這種過時的語言 加入rust/llvm (其實rust也有一些少數的UB 其他程式也有) 有句話這麼說: Rewriting everything with rust! 3. 其他程式語言 多少也有這種UB 然後C/C++這種底層的東西 有些python程式也會摳它 自然繼承了UB 所以在說程式邪門之前 是否這個邪門 是這個所謂的UB所造成的呢? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.24.212.214 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_Chat/M.1674724075.A.D84.html ※ 編輯: dzwei (114.24.212.214 臺灣), 01/26/2023 17:12:18
TeamFrotress: I don't know what it means, but it scares me.01/26 17:11
OlaOlaOlaOla: rust 是多好,你已經是第三個在推的人了...我該開01/26 17:12
OlaOlaOlaOla: 始學了嗎幹....01/26 17:12
ltytw: 所以當初VB6.0的團隊真的是爆肝01/26 17:12
nh60211as: 未定義行為01/26 17:12
nisioisin: 所以最好不要用這種可能有分歧的寫法阿01/26 17:12
但其實好一點的編譯器會拋出警告啦 問題是目前C++/C還有很多UB不會拋出警告 所以我才說歡迎加入 編譯器"非常嚴格"的Rust ※ 編輯: dzwei (114.24.212.214 臺灣), 01/26/2023 17:14:35
LeeXX: 新手入坑主流還是推python吧膠水語言 至少寫點實用小外掛01/26 17:16
LeeXX: 會有點成就感01/26 17:16
真的 其實我工作的時候 也不懂一些人只是用csv畫個圖 卻要用dependency那麼複雜的cern root... python+matplotlib+panda就能搞定的東西.. ※ 編輯: dzwei (114.24.212.214 臺灣), 01/26/2023 17:17:17
LeeXX: Ola大好像不是新手?01/26 17:16
OlaOlaOlaOla: 看到膠水語言直接笑出來01/26 17:18
※ 編輯: dzwei (114.24.212.214 臺灣), 01/26/2023 17:19:57
LeeXX: 話說聽說3.11有把以前錯誤訊息很亂的問題改好 不知道真的01/26 17:19
LeeXX: 假的01/26 17:19
沒 還是rust和clang給的訊息比較有用 python還是老樣子 錯誤訊息只會給stack unwinding ※ 編輯: dzwei (114.24.212.214 臺灣), 01/26/2023 17:21:05
justgetup: Rust比較不會有C++這種迭代的問題?01/26 17:20
Pep5iC05893: 什麼是膠水語言01/26 17:21
I have panda I have matplotlib oh~ panplotlib 大概是這樣 ※ 編輯: dzwei (114.24.212.214 臺灣), 01/26/2023 17:22:23
LeeXX: 外掛一般還是用pyinstaller+pyautogui+tkinter吧(然後在01/26 17:22
LeeXX: 壓成腳本時就會東缺西缺 cv2等等麻煩自己hidden import…01/26 17:22
LeeXX: …)01/26 17:22
iamnotgm: 原來還有這種狀況 所以為什麼說python是膠水語言?01/26 17:22
LeeXX: 膠水語言->我看到這個用法是在形容它什麼都能做01/26 17:22
LeeXX: 那我就不冒險升級了01/26 17:23
justgetup: 膠水語言=>跑得慢,但他能用01/26 17:25
居然 我以為是AMD那個膠水CPU的梗 ※ 編輯: dzwei (114.24.212.214 臺灣), 01/26/2023 17:25:47
LeeXX: 一個膠水三種說法w(為啥膠水是跑得慢?01/26 17:26
HAmakers: 但是用了python就回不去了 社群太方便了01/26 17:27
LeeXX: 很慢乾掉的意思?01/26 17:27
LeeXX: 真的 當年還想學lisp 結果社群完全無法比01/26 17:29
LeeXX: 不過最近實戰發現matlab和wolfram的mathematica還是有些東01/26 17:29
LeeXX: 西不是社群能輕易取代的01/26 17:29
LeeXX: 我就是在說你們兩個啦sympy和scipy01/26 17:29
justgetup: 膠水乾的比較慢,但他功能是有的,01/26 17:30
justgetup: 而且剛好跟python一樣,01/26 17:30
justgetup: 適合剛開始勞作(打碼)的人使用01/26 17:30
tkc7: 所以rust好在哪01/26 17:31
太多了 這可以寫很長一篇 沒人想看完的文章(?) 我舉幾個簡單的說 1. 嚴格的語法 嚴格的編譯器 有句話說 過的了rust的編譯器 沒有拋出錯誤訊息 就是memory safe 也有thread safe 2. 效能近乎C++ 3. 有LLVM的支援,開發、維護編譯器相對容易 ※ 編輯: dzwei (114.24.212.214 臺灣), 01/26/2023 17:34:05
Bencrie: 你可以等 moz://a 把 firefox 用 rust 重寫再來學啊01/26 17:31
現在要吹捧rust不是用火狐了啦 是amazon做的s2n-quic 一個QUIC的rust實作方式 這個是有大量的應用的 現在火狐團隊根本射後不理
justgetup: 推Python社群真的好用01/26 17:32
Ikaros1110: 最近學Rust analysis超強01/26 17:34
※ 編輯: dzwei (114.24.212.214 臺灣), 01/26/2023 17:36:35
dreamnook2: rust感覺有勢頭 不過自學好懶01/26 17:36
其實難度也沒比C++簡單到哪去 他只是拋掉很多C++98的歷史包袱 全部modern C++的觀念套進去 就是rust了 modern C++其實並不簡單 所以rust也不簡單 建議有modern C++的概念 再來玩轉rust ※ 編輯: dzwei (114.24.212.214 臺灣), 01/26/2023 17:43:39
thelittleone: 原來是來傳教的(誤01/26 17:44
沒 你看我C++/C的UB寫了那麼多東西(?) ※ 編輯: dzwei (114.24.212.214 臺灣), 01/26/2023 17:53:06
qaz223gy: 謝謝 完全看不懂01/26 17:54
這本來就是有點C語言基礎人 需要關注的議題XD 礙於篇幅不方便寫太多 剩下的去看我前面貼的 Jserv說的那個吧 裡面也有YT連結
HAmakers: 感覺要普及還要一段時間吧 畢竟太多專案用c/c++寫的01/26 17:56
個人估計至少要十年了
ragwing: …還好我不靠寫code謀生01/26 17:56
SPDY: 算小型的跨平台FLAC專案 下載最新的VC和SDK 編譯過關沒出錯01/26 18:05
SPDY: 但老邁又封閉歷經無數接手的大型違章建築 就難說順不順利XD01/26 18:05
Erichikaunkr: 真的 rust才是未來01/26 18:08
但也是有它難學的地方XD
lbowlbow: 未定義行為就跟js一樣糞01/26 18:10
別這樣說 大家的瀏覽器都靠js的QQ ※ 編輯: dzwei (114.24.212.214 臺灣), 01/26/2023 18:15:38
dos01: 恩恩 我也是這樣想01/26 18:21
rippleofmoon: 推這篇 有趣01/26 18:25
kokal: C&C++還有implementaion defined,也是個用不同complier會有01/26 18:33
kokal: 不同結果的地方, 都需要讀過standard, 相當麻煩XD01/26 18:34
不過有standard真的是好是 rust還沒那麼一個完整的standard iso那種的standard
kaitokid1214: https://i.imgur.com/tvTPTA5.jpg01/26 18:34
hizuki: rust沒法相容C++ABI,就是和歷史作對01/26 18:44
前面說的 這樣ub或unsafe也會跟著繼承下來 rust的著學就是Rewriting 雖然官方repo還是找的到 很多binding就是 熱門的套件沒時間重寫 還是得依賴binding ※ 編輯: dzwei (114.24.212.214 臺灣), 01/26/2023 18:49:29
XXXaBg: js更可怕01/26 18:49
※ 編輯: dzwei (114.24.212.214 臺灣), 01/26/2023 18:52:03
dzwei: 其實我真的很佩服寫JS的人 就是因為我真的學不來01/26 18:54
dzwei: 看得滿頭問號QQ01/26 18:54
gary82gary: 何不用scanf跟printf,cin 跟cout個人覺得難用01/26 19:02
arrenwu: cin 跟cout個人覺得難用+101/26 19:03
類似我前面那段 printf("%d %d %d\n", i++, i--, i--); 這也是UB哦 cout的好處是compiler 可以自動推斷性別 雖然特殊性別還是要對cout動點手腳就是
Richun: rust不用太神話,雖然它算目前少數以安全為第一目標的語言01/26 19:07
我覺得 他光是能成為linux kernel 6.0 的第二開發語言 已經夠神了 你看c++20幾年了都沒有這樣XD ※ 編輯: dzwei (223.140.209.40 臺灣), 01/26/2023 19:11:19
Richun: the book裡面都示範怎麼寫個safe但會memory leak的code了w01/26 19:08
ohmylove347: 好奇rust到底能不能在效能上超越C? 01/26 19:09
d630200x: c&cpp版都開放可以問rust問題,候捷又退出翻譯圈,感覺c 01/26 19:11
d630200x: pp真的沒啥未來了 01/26 19:11
Richun: C++我怎麼印象沒穩定ABI,有穩定ABI的是C。 01/26 19:12
king00000000: 我寫js,我很佩服寫C跟C++的人,我腦袋會燒掉01/26 19:12
Richun: type用型態啦 形別打錯字看起來變奇怪的東西惹01/26 19:13
d630200x: 我反而佩服寫js的,到底為啥不會被那個機掰語法搞瘋01/26 19:16
Richun: https://i.imgur.com/5pFXFbR.jpg 我也很佩服寫JS的人01/26 19:18
dreamnook2: js繞過那個g8語法後就習慣了01/26 19:23
cn5566: 這的確不是邪門 因為C++ compiler真的改個版就天下大亂01/26 19:30
cn5566: 比較邪門的通常會出現在大系統裡 用比較高階的語言01/26 19:30
cn5566: 去寫不同的module 然後各種巧合發生才造成的01/26 19:31
StSoSnE: 這種結果by編譯器寫法的狀況 以前高考有出過 我氣到寫申01/26 19:44
StSoSnE: 訴 然後他們回我改考卷的教授會斟酌批改... 01/26 19:44
b0920075: c++ 沒未來XDD01/26 19:51
as80110680: 要是誰讓我看到他寫這種狗屎爛扣,我一定打斷他的腿01/26 19:54
我早就看 i = ++j 與 i = j++ 這種扣不爽很久了== 雖然不是ub 但是很惱人 python跟rust還有一些更先進的語言 都把他拿掉了
timofEE: 到底為什麼不先定義 故障與否交給編譯器決定很好玩? 01/26 20:05
dgplayer: 為什麼不定義這個要問開發者 使用者只能避免用未定義語 01/26 20:16
dgplayer: 法寫code 或者乾脆用別的語言 01/26 20:16
Richun: 我想是訂標準時,他們不認為會有人在同行裡面塞一堆++在搞01/26 20:17
as80110680: 就像為什麼微波爐說明書不會寫不能微波貓狗一樣,到底01/26 20:28
as80110680: 誰會沒事做這種噁心事01/26 20:29
也可能是Kiss原則吧 因為你要塞這些防火防爆防閨密的東東 勢必會增加編譯器的複雜度 讓編譯器更難開發 clang也只是丟出警告 並不阻止你通過編譯
container: 哥真專業碼農,推01/26 20:39
LeTao536: 要把軟體用rust重寫應該沒公司會願意,成本太高了,除01/26 21:06
LeTao536: 非重寫之後有非常巨大的效能進步01/26 21:06
LeTao536: 很難確保重寫之後不喪失原有的feature,regression有其01/26 21:06
LeTao536: 侷限性,再來就是重寫過程中客戶issue可不會等你,工程01/26 21:06
LeTao536: 師又要多線作戰01/26 21:06
LeTao536: 而且工程師也都沒碰過rust,某種程度都是rust新手,這01/26 21:06
LeTao536: 樣一來程式品質也不會多高01/26 21:06
LeTao536: 最後就是rust還不夠主流,就業市場上熟悉C/C++的人肯定 01/26 21:06
LeTao536: 還是大宗,公司若要補人去哪找有豐富rust經驗的人 01/26 21:06
p257416000: 讓我想起初學程式語言,i++跟++i搞了很久才懂 01/26 21:07
jarr: 大型專案的程式碼太龐大了 不太可能換另一套語言改寫01/26 21:31
Richun: 既有的C/C++專案要重寫很難,rust自己在用的LLVM是個例子01/26 21:40
Richun: 大致上是大公司才有能力重寫,rust在管理上方便很多。01/26 21:42
Richun: 另外一個rust的問題是用到LGPL的情況,現在有常用解了嗎?01/26 21:43
jasonwuton: 我好害怕01/26 22:00
cyrano: license 問題 cargo 有 plugin 可以檢查像 cargo deny01/26 22:06
ohmylove347: rust也能調用其他語言的庫吧?應該不用完全重寫,新01/26 22:15
ohmylove347: 的需求再用就好了這樣?01/26 22:15
上面有說了 可能會繼續把ub 或其他不安全的因素繼承下來 但是不怕的話 其實有不少c++的ffi可以摳 比方說opencv就有
meRscliche: push01/26 22:49
※ 編輯: dzwei (223.140.209.40 臺灣), 01/26/2023 23:26:32
QwBert: Rust的需求還是在需要性能跟安全的地方吧 大型專案一旦決 01/26 23:32
QwBert: 定tech stack 要轉換就很麻煩吧 01/26 23:32
QwBert: 主要還是遇到瓶頸時才會跟換Discord 的一部份服務就從gol 01/26 23:37
QwBert: ang 換成Rust解決垃圾回收的問題 01/26 23:37
jerrycool123: 某些老師:好耶C++17 有定義了我要繼續考學生一堆+ 01/27 01:07
jerrycool123: +—在同一行的 01/27 01:07
jerrycool123: 程式碼 01/27 01:07
SLMT: 強力推薦 Rust,我已經寫六年了,變成我的主力語言了 01/27 01:07
a58524andy: 某種程度上C++比Rust還難學 01/27 02:54
a58524andy: https://imgur.com/3wlxtI0 01/27 02:54
gbls9527341: 推 01/27 03:52
hanmas: 這不就你寫垃圾code得到垃圾結果? 幹嘛把運算跟輸出混在 01/27 14:38
hanmas: 一起 01/27 14:38