[討論] 該學習C++嗎?

作者: Matz (妹妹C吸)   2020-07-08 19:13:21
本魯一個弱弱的資工本科生。
在學校學過C、Java、javascript。
但後面兩個課上完後就沒碰過了(幾乎忘光)。
平常都是寫C(一些小遊戲、刷題)
專題也是用C語言。
想問如果單純專攻C語言,對未來就業好嗎?
還是需要搭配別的語言會比較好?
作者: james732 (好人超)   2020-07-08 19:44:00
把你學過的這三個摸到精熟的話就非常厲害了
作者: Schottky (順風相送)   2020-07-08 19:56:00
光靠精通 C 語言就能賺飽飽了要不要學其他的語言看你自己高興,並不是必要的
作者: Killercat (殺人貓™)   2020-07-08 22:32:00
C要精通很難 要靠這精通賺飽更難 可以看看硬體廠薪資C++機會還大一點 憑良心說 XD
作者: Clangpp (Clang++)   2020-07-09 01:02:00
c++才比較難學吧...
作者: Schottky (順風相送)   2020-07-09 02:08:00
如果你看到可以拿 C 刷題的人說自己弱,千萬別相信他。
作者: expiate (夜露死苦)   2020-07-09 06:12:00
刷題用 c那幾乎資料結構都是手刻的阿!神!
作者: Feis (永遠睡不著 @@)   2020-07-09 07:37:00
用 C 寫 LeetCode 的話,如果不要求一次過的話,個人經驗是不會特別難。只是看目的比較麻煩的主要是 I/O 處理但剛好 LeetCode 比較少這問題
作者: Killercat (殺人貓™)   2020-07-09 09:32:00
不過以就業來講 台灣C除非頂尖 不然就是吃不飽餓不死為了就業而想多學的語言來講 我個人比較推java跟go 可以試試看這兩個
作者: lc85301 (pomelocandy)   2020-07-09 10:25:00
不用,學 rust(欸
作者: MartinJ40 (Martin J-40)   2020-07-09 10:38:00
愛惜生命遠離java/c++ 要也是python rust這些新興語言想走前後端jsC++擁有所有paradigm 怎麼可能比C簡單光template就是一個語言的難度
作者: Killercat (殺人貓™)   2020-07-09 11:22:00
er..我說的C++機會大一點 是說「賺飽的機會」不是說好學。java是滿藍海的說真的,但是position目前來看還是很多,go的話是真的不錯,rust也讚但是目前機會較少
作者: cphe (魔鬼藏在垃圾筒裡)   2020-07-09 12:42:00
用C刷光是刻資料結構就飽了,刻完才是真正開始解題
作者: aecho (@..@")   2020-07-09 16:54:00
啊嗚…就業的話…資料結構與演算法要學好呀 -.-如果有教資料庫的話,那個ACID也要好好搞懂呀 Orz進職後被丟去學MFC, C#, Obj-C 都是一堆學校沒教過的
作者: Schottky (順風相送)   2020-07-09 19:01:00
平常好像不會聽到有人勸開戰鬥機的去開計程車就好
作者: CoNsTaR ((const *))   2020-07-10 00:44:00
系統語言 rust 最讚沒有之一
作者: KanzakiHAria (神崎・H・アリア)   2020-07-10 08:42:00
不會有人想特地學戰鬥機目的是找工作啊想就業最多也是民航飛機 怎麼樣都不會是戰鬥機
作者: Schottky (順風相送)   2020-07-10 11:13:00
如果還沒學,我同意。但人家已經開著戰鬥機飛來飛去了然後你跟他說計程車的職缺比較多去學開計程車
作者: Killercat (殺人貓™)   2020-07-10 14:55:00
C...戰鬥機喔... 好吧,只能說我尊重你的看法 XD人家就是問就業問題 當然就以市場來回答啊...C在就業市場的確「相對沒那麼強勢」也是事實吧
作者: petercoin (彼得幣)   2020-07-11 00:08:00
台灣高薪的軟體相關職缺還是IC廠韌體居多吧?
作者: Dracarys (MayShowGunMore)   2020-07-11 00:08:00
S大描述的真傳神XD
作者: loveme00835 (髮箍)   2020-07-11 01:53:00
人活得好好地為什麼要學希佳佳呢 Q_Q
作者: alex70266 (小眼)   2020-07-11 16:09:00
看就業的方向是哪種吧,往韌體/嵌入式走的話不太會C還是很痛苦的不過去摸點C++不是什麼壞事啦
作者: flarehunter (Range)   2020-07-11 21:36:00
我覺得不用執著語言,學點不同思考的方法,像是FP,OOP, 設計模式, 軟體工程,推薦看clean code系列書反正出社會工作八成是沒學過的事,練基礎功總是有用M大說C++有所有範式,所以用C++學這些範式也不錯
作者: ddavid (謊言接線生)   2020-07-11 23:36:00
就算C真的是戰鬥機好了,你也要真的開得好才會賺得來,只是會開的話,升空也就是被打下來的分
作者: bben900911 (Ben)   2020-07-12 00:09:00
看起來對C頗有心得。 去IC廠當韌體寫C,薪水不錯吧?
作者: CoNsTaR ((const *))   2020-07-13 07:06:00
C++ 有所有範式反對一票,光是 fp 就沒有了
作者: flarehunter (Range)   2020-07-13 08:45:00
有c++11開始有lambda也可以傳來傳去 可以算有fp吧?
作者: CoNsTaR ((const *))   2020-07-13 08:59:00
這和 fp 說他們有 first class module(或 record)存 context,可以算 OOP 有什麼不同 XD
作者: ray2501 (貓是一隻貓)   2020-07-13 10:23:00
不就有 lambda calculus,然後可以函式輸出和輸入,就算有初步支援了嗎? 從定義上來看,C++ 是有支援啊
作者: flarehunter (Range)   2020-07-13 10:52:00
如果可以支援多型來達到依賴反轉,我就覺得算是OOP吧
作者: loveme00835 (髮箍)   2020-07-13 10:59:00
用 OOP/SOLID 來考慮學 C++ 是否搞錯什麼 xD C++ 的特色又不是 OO
作者: flarehunter (Range)   2020-07-13 11:03:00
我也是覺得語言不重要 重要的是那些概念
作者: Killercat (殺人貓™)   2020-07-13 11:04:00
事實上C++的OO還滿薄弱的 不過因為有template,所以metaprogramming下的彈性簡直是作弊沒interface 沒object 說真的要當真正的OO還有段路XD拿來學一些當infrastructure library的東西倒是讚看看那個Loki::SingletonHolder寫得多彈性 XD重點是還真的易用 超易用目前還沒看過哪種別的語言(可能除了C的macro外)可以把infrastructure library做得那麼有彈性且好用的
作者: CoNsTaR ((const *))   2020-07-13 11:07:00
@ray2501 有 lambda calculus 是個什麼說法 orz可以函數輸入輸出又是什麼說法 orz你的定義怎麼好像跟別人都不太一樣 XD@Killercat Agda 呢?連 reflection 都是用自己寫的
作者: Killercat (殺人貓™)   2020-07-13 11:16:00
好吧那應該是我看過的語言不夠多 :P不過我想主流語言裡面應該C++這點是近乎無敵了
作者: flarehunter (Range)   2020-07-13 11:20:00
@CoNsTaR 你認為的FP應該有哪些概念啊?
作者: CoNsTaR ((const *))   2020-07-13 11:36:00
如果要“成為”一個 FP 語言,最重要的前提是必須是 declarative 吧,或至少在某些範圍內是 declarative,或者就算做不到也要有一些 compromise 的產物,例如 rust 的 mutable 之類的如果只是想要“支援 FP”最重要的就是要有 GADT 去配合某種 exhaustive check(例如 pattern matching in terms of pattern calculus,或是 Scott、Church encoding in terms of lambda calculus),和 first class function*某種類似 GADT 去配合某種 exhaustive check
作者: ray2501 (貓是一隻貓)   2020-07-13 11:53:00
第一步是 First-class and higher-order functions,可以接受函式當作輸入輸出,這 c++ 早就有了,你的定義才奇怪
作者: CoNsTaR ((const *))   2020-07-13 12:04:00
我不是故意要在 c/cpp 版討論 fp(你可以去 PLT 版開一篇,我或其他大大可以在那裡回你),只是如果真的是 firstclass,有可能會不是 higher order 嗎?為什麼要分成兩個條件?然後既然是 first class,為什麼 c++ 不能有 flip 和 partial application?(我知道有 bind)解釋一下,我說的「類似 GADT 去配合某種 exhaustive check」是打造 first class 函數的其中一種方法,只有用這種方法產生函數的語言才能算是某種 FP
作者: flarehunter (Range)   2020-07-13 12:36:00
我理解的範式是指如何思考程式架構的方法,像是結構化能夠divide and conquer, OOP可以用多型控制依賴方向FP我就不熟,只有理解到可以用小函式組合出大函式和分離有side effect的部份讓平行化順利一點感覺你提的都有點像是語言特性,不是FP範式必要功能?pattern matching和if else在程式架構上有什麼差異?
作者: CoNsTaR ((const *))   2020-07-13 12:51:00
我也是啊(程式架構的方法),所以我開頭就說了必須是 declarative後來提的 GADT,pattern matching,和 first class function 都是讓你能夠用「fp 的方法」建構程式的要素,缺一個就無法獨立運作所以我才會說 c++ 不支援 fp(不能用 fp 的方法建構程式),因為三個裡面根本沒有一個支援,最接近 fp 的也只有higher order function 而已if else 是對 boolean 做 induction(elimination),pattern matching 是對任何 type 的 induction,意思是只要是 type,就能夠被使用因為 c++ 的 bool 來歷不明(你找不到 bool 這個 type的 definition),if else 也來歷不明,你找不到 if else 的 definition(形式化 if else 的方法),但在 fp,這些都是可以用程式寫出來的(不是說寫一個編譯器,而是你要用 bool 你可以自己寫一個 bool,你要 pattern matching,你可以自己用 Scott encoding),這個算是 if else 和pattern matching 最大的差別
作者: MartinJ40 (Martin J-40)   2020-07-13 15:13:00
https://www.stroustrup.com/OpenPatternMatching.pdffunctional programming跟CFG是等價C++ template跟turning是等價怎麼可能Type-3做不出來Type-2文法.....
作者: CoNsTaR ((const *))   2020-07-13 16:35:00
...... 我不知道要講什麼了 orz你真的知道你講的那些名詞是什麼意思嗎?關於那個 library,等到它不用 macro 的時候再來嘴吧
作者: MartinJ40 (Martin J-40)   2020-07-13 17:01:00
我的意思是 你提的那些特性 是能先用template刻出來只基於這些刻出來的物件去寫程式的話 不就相當於FP用刻出來的這些元件再去作 BOOL IF ELSE而非使用原本c++的關鍵字
作者: CoNsTaR ((const *))   2020-07-13 17:12:00
問題是 TMP 做不到這樣啊,TMP 自己都做不到 FP 很多事情了,你怎麼會期待用它寫出來的元件可以 magically 把你的程式“變成” FP
作者: flarehunter (Range)   2020-07-13 17:55:00
雖然已經偏離原來問題很遠了,不過難得在C++版有FP討論串XD 我想繼續問以FP的角度會怎麼架構一個系統?GADT和pattern matching為什麼會是必要功能? Lisp是不是沒有這些功能啊?
作者: loveme00835 (髮箍)   2020-07-13 18:37:00
以為走錯板, 原來是在討論 Ancient C++
作者: CoNsTaR ((const *))   2020-07-13 18:39:00
如果能接受英文的話可以看這個https://youtu.be/PLFl95c-IiU它標題雖然寫 DDD 可是其實是在講 FPlisp 我不會,但不一定非得 GADT,GADT 和 pattern matching 也都只是語法糖而已,別的類似的東西也可以如果你接受 untyped 的程式,你也可以完全不要任何類似 GADT 或 pattern matching 的東西,就完全的 function 也是可以,但我認為大部分人說的 FP 不是那樣的東西那要請教一下 L 大 How modern C++ looks like
作者: loveme00835 (髮箍)   2020-07-13 19:05:00
要嘴 @MartinJ40 的連結跟 macro 也先看一下 [P1371]跟 [P1221] 的狀態, C++ 也是 community driven lang還要經過 ISO commitee review, 除了相容性要顧最重要的是 "標準化" 這件事. 你喜歡其他語言是你的自由,但是在說 "某語言都沒有什麼特性" 前先搞清楚自己是不是真的熟悉它, 然後如果覺得什麼特性很缺, 你可以發提案, 這就是 how modern C++ looks like看討論還以為是考古學有什麼重要發現簡單的說, 不需要標準化的語言你想要什麼特性都很容易
作者: CoNsTaR ((const *))   2020-07-13 19:42:00
整理了一下:1. C++ 是地表最強語言,因為不論什麼功能沒有都只是目前沒有,什麼功能不好都只是目前不好,以後還是都會有,都會變好的2. 要是真的不能有,也是因為相容性和標準化,才不是因為 C++ 不支援我是不知道把語言的“狀況”寫在紙上叫它“標準”有什麼神奇的效果,但就我所知,所有的社群語言誰不是經過很多年的討論才會讓實作成為語言的一部分,語言的發展哪個沒有目標和提案,哪個不會考慮相容性如果有一個人跑來跟你說 Haskell 有 dependent types,沒有 dependent types 的都是 ancient Haskell 你覺得如何?
作者: flarehunter (Range)   2020-07-13 19:54:00
影片講得滿簡單清楚,有稍微理解FP的實際用處,謝謝影片裡的例子用C++的struct+enum也可以兜出來吧
作者: CoNsTaR ((const *))   2020-07-13 20:01:00
enum 的確在有些狀況下可以做 sum type可以用 struct(product type,and)和 inheritance(sumtype,or)兜出來雖然這兩個東西本意應該也不是給你這樣用的就是了 XD然後那個影片只是在講用 FP 做 typing 的方法,還是有很多其他東西是沒有講到的,所以真的用 FPL 寫程式的時候可能還是會有點陌生
作者: loveme00835 (髮箍)   2020-07-13 20:06:00
你已經幫我回答大部分的問題了. 語言標準化尤其是 ISO 標準, 最終都是為了服務業界. 所以有關 functionallanguage 的提案被 reject 是常有的事情, 能用舊特性達成的功能, 除非新特性可以做得更好更有 "效率",否則它不會變成語言的一部分. 標準化圍繞在軟體開發議題上; 而不是發掘語言的可能性. 所以前面才會說道先熟悉這個語言再來評論比較好這就好像討論為什麼魚沒有腳, 所以和雞比牠絕對跑不快一樣.你來魚板不去了解為什麼魚不長腳, 然後推廣雞有腳多棒不是很奇怪嗎? 而且我從來沒有說過魚是最棒的生物,你的自然語言可能也有待加強.
作者: CoNsTaR ((const *))   2020-07-13 20:14:00
我會在這邊回是因為有人宣揚 c++ 支援 FP,你可能漏看前因後果了我不會沒事跑去跟不認識的人說某個語言沒有某個特性/功能,目前沒那麼無聊,謝謝而且 fyi,就算你講的那兩個提案都通過了,c++ 仍然離支援 FP 非常遙遠至少我想不出有什麼提案的組合能夠讓 c++ 支援 FP 又向後相容啦,可能我廢
作者: yoco (眠月)   2020-08-15 23:38:00
不該

Links booklink

Contact Us: admin [ a t ] ucptt.com