[討論] 該學習C++嗎? - 看板C_and_CPP - 批踢踢實業坊

文章推薦指數: 80 %
投票人數:10人

推MartinJ40: 愛惜生命遠離java/c++ 要也是python rust這些新興語言 07/09 10: ... flarehunter: pattern matching和if else在程式架構上有什麼差異? 批踢踢實業坊 › 看板C_and_CPP 關於我們 聯絡資訊 返回看板 作者Matz(イラマチオ研究員)看板C_and_CPP標題[討論]該學習C++嗎?時間WedJul819:13:212020 本魯一個弱弱的資工本科生。

在學校學過C、Java、javascript。

但後面兩個課上完後就沒碰過了(幾乎忘光)。

平常都是寫C(一些小遊戲、刷題) 專題也是用C語言。

想問如果單純專攻C語言,對未來就業好嗎? 還是需要搭配別的語言會比較好? -- ※發信站:批踢踢實業坊(ptt.cc),來自:1.171.72.222(臺灣) ※文章網址:https://www.ptt.cc/bbs/C_and_CPP/M.1594206803.A.5F9.html →james732:把你學過的這三個摸到精熟的話就非常厲害了07/0819:44 →Schottky:光靠精通C語言就能賺飽飽了07/0819:56 →Schottky:要不要學其他的語言看你自己高興,並不是必要的07/0819:59 推Killercat:C要精通很難要靠這精通賺飽更難可以看看硬體廠薪資07/0822:32 →Killercat:C++機會還大一點憑良心說XD07/0822:33 推Clangpp:c++才比較難學吧...07/0901:02 推Schottky:如果你看到可以拿C刷題的人說自己弱,千萬別相信他。

07/0902:08 推expiate:刷題用c那幾乎資料結構都是手刻的阿!神!07/0906:12 →Feis:用C寫LeetCode的話,如果不要求一次過的話,個人經驗是07/0907:37 →Feis:不會特別難。

只是看目的07/0907:37 →Feis:比較麻煩的主要是I/O處理07/0907:38 →Feis:但剛好LeetCode比較少這問題07/0907:39 →Killercat:不過以就業來講台灣C除非頂尖不然就是吃不飽餓不死07/0909:32 →Killercat:為了就業而想多學的語言來講我個人比較推java跟go可07/0909:46 →Killercat:以試試看這兩個07/0909:46 推lc85301:不用,學rust(欸07/0910:25 推MartinJ40:愛惜生命遠離java/c++要也是pythonrust這些新興語言07/0910:38 →MartinJ40:想走前後端js07/0910:39 →MartinJ40:C++擁有所有paradigm怎麼可能比C簡單07/0910:41 →MartinJ40:光template就是一個語言的難度07/0910:42 →Killercat:er..我說的C++機會大一點是說「賺飽的機會」不是說好07/0911:22 →Killercat:學。

java是滿藍海的說真的,但是position目前來看還是07/0911:23 →Killercat:很多,go的話是真的不錯,rust也讚但是目前機會較少07/0911:23 →cphe:用C刷光是刻資料結構就飽了,刻完才是真正開始解題07/0912:42 感謝各位大大的建議了。

※編輯:Matz(122.116.159.149臺灣),07/09/202016:35:04 推aecho:啊嗚…就業的話…資料結構與演算法要學好呀-.-07/0916:54 →aecho:如果有教資料庫的話,那個ACID也要好好搞懂呀Orz07/0916:56 →aecho:進職後被丟去學MFC,C#,Obj-C都是一堆學校沒教過的07/0916:57 推Schottky:平常好像不會聽到有人勸開戰鬥機的去開計程車就好07/0919:01 推CoNsTaR:系統語言rust最讚沒有之一07/1000:44 推KanzakiHAria:不會有人想特地學戰鬥機目的是找工作啊07/1008:42 →KanzakiHAria:想就業最多也是民航飛機怎麼樣都不會是戰鬥機07/1008:42 推Schottky:如果還沒學,我同意。

但人家已經開著戰鬥機飛來飛去了07/1011:13 →Schottky:然後你跟他說計程車的職缺比較多去學開計程車07/1011:13 →Killercat:C...戰鬥機喔...好吧,只能說我尊重你的看法XD07/1014:55 →Killercat:人家就是問就業問題當然就以市場來回答啊...07/1014:55 →Killercat:C在就業市場的確「相對沒那麼強勢」也是事實吧07/1014:57 →petercoin:台灣高薪的軟體相關職缺還是IC廠韌體居多吧?07/1100:08 推Dracarys:S大描述的真傳神XD07/1100:08 推loveme00835:人活得好好地為什麼要學希佳佳呢Q_Q07/1101:53 →alex70266:看就業的方向是哪種吧,往韌體/嵌入式走的話07/1116:09 →alex70266:不太會C還是很痛苦的07/1116:10 →alex70266:不過去摸點C++不是什麼壞事啦07/1116:14 推flarehunter:我覺得不用執著語言,學點不同思考的方法,像是FP,07/1121:36 →flarehunter:OOP,設計模式,軟體工程,推薦看cleancode系列書07/1121:36 推flarehunter:反正出社會工作八成是沒學過的事,練基礎功總是有用07/1121:40 推flarehunter:M大說C++有所有範式,所以用C++學這些範式也不錯07/1121:48 推ddavid:就算C真的是戰鬥機好了,你也要真的開得好才會賺得來,只07/1123:36 →ddavid:是會開的話,升空也就是被打下來的分07/1123:37 推bben900911:看起來對C頗有心得。

去IC廠當韌體寫C,薪水不錯吧?07/1200:09 推CoNsTaR:C++有所有範式反對一票,光是fp就沒有了07/1307:06 推flarehunter:有c++11開始有lambda也可以傳來傳去可以算有fp吧?07/1308:45 推CoNsTaR:這和fp說他們有firstclassmodule(或record)存co07/1308:59 →CoNsTaR:ntext,可以算OOP有什麼不同XD07/1308:59 推ray2501:不就有lambdacalculus,然後可以函式輸出和輸入,就算07/1310:23 →ray2501:有初步支援了嗎?從定義上來看,C++是有支援啊07/1310:23 推flarehunter:如果可以支援多型來達到依賴反轉,我就覺得算是OOP吧07/1310:52 →loveme00835:用OOP/SOLID來考慮學C++是否搞錯什麼xDC++的07/1310:59 →loveme00835:特色又不是OO07/1310:59 推flarehunter:我也是覺得語言不重要重要的是那些概念07/1311:03 →Killercat:事實上C++的OO還滿薄弱的不過因為有template,所以07/1311:04 →Killercat:metaprogramming下的彈性簡直是作弊07/1311:04 →Killercat:沒interface沒object說真的要當真正的OO還有段路XD07/1311:04 →Killercat:拿來學一些當infrastructurelibrary的東西倒是讚07/1311:05 →Killercat:看看那個Loki::SingletonHolder寫得多彈性XD07/1311:06 →Killercat:重點是還真的易用超易用07/1311:06 →Killercat:目前還沒看過哪種別的語言(可能除了C的macro外)可以把07/1311:07 →Killercat:infrastructurelibrary做得那麼有彈性且好用的07/1311:07 推CoNsTaR:@ray2501有lambdacalculus是個什麼說法orz07/1311:07 →CoNsTaR:可以函數輸入輸出又是什麼說法orz07/1311:07 →CoNsTaR:你的定義怎麼好像跟別人都不太一樣XD07/1311:08 推CoNsTaR:@KillercatAgda呢?連reflection都是用自己寫的07/1311:13 →Killercat:好吧那應該是我看過的語言不夠多:P07/1311:16 →Killercat:不過我想主流語言裡面應該C++這點是近乎無敵了07/1311:16 推flarehunter:@CoNsTaR你認為的FP應該有哪些概念啊?07/1311:20 推CoNsTaR:如果要“成為”一個FP語言,最重要的前提是必須是decl07/1311:36 →CoNsTaR:arative吧,或至少在某些範圍內是declarative,或者就07/1311:36 →CoNsTaR:算做不到也要有一些compromise的產物,例如rust的mu07/1311:36 →CoNsTaR:table之類的07/1311:36 →CoNsTaR:如果只是想要“支援FP”最重要的就是要有GADT去配合某07/1311:36 →CoNsTaR:種exhaustivecheck(例如patternmatchingintermso07/1311:37 →CoNsTaR:fpatterncalculus,或是Scott、Churchencodinginte07/1311:37 →CoNsTaR:rmsoflambdacalculus),和firstclassfunction07/1311:37 推CoNsTaR:*某種類似GADT去配合某種exhaustivecheck07/1311:39 推ray2501:第一步是First-classandhigher-orderfunctions,可以07/1311:53 →ray2501:接受函式當作輸入輸出,這c++早就有了,你的定義才奇怪07/1311:54 推CoNsTaR:我不是故意要在c/cpp版討論fp(你可以去PLT版開一篇07/1312:04 →CoNsTaR:,我或其他大大可以在那裡回你),只是如果真的是first07/1312:04 →CoNsTaR:class,有可能會不是higherorder嗎?為什麼要分成兩07/1312:04 →CoNsTaR:個條件?07/1312:04 →CoNsTaR:然後既然是firstclass,為什麼c++不能有flip和par07/1312:04 →CoNsTaR:tialapplication?(我知道有bind)07/1312:04 推CoNsTaR:解釋一下,我說的「類似GADT去配合某種exhaustiveche07/1312:15 →CoNsTaR:ck」是打造firstclass函數的其中一種方法,只有用這07/1312:15 →CoNsTaR:種方法產生函數的語言才能算是某種FP07/1312:15 推flarehunter:我理解的範式是指如何思考程式架構的方法,像是結構化07/1312:36 →flarehunter:能夠divideandconquer,OOP可以用多型控制依賴方向07/1312:38 推flarehunter:FP我就不熟,只有理解到可以用小函式組合出大函式和07/1312:42 →flarehunter:分離有sideeffect的部份讓平行化順利一點07/1312:43 →flarehunter:感覺你提的都有點像是語言特性,不是FP範式必要功能?07/1312:44 →flarehunter:patternmatching和ifelse在程式架構上有什麼差異?07/1312:47 推CoNsTaR:我也是啊(程式架構的方法),所以我開頭就說了必須是de07/1312:51 →CoNsTaR:clarative07/1312:51 →CoNsTaR:後來提的GADT,patternmatching,和firstclassfunct07/1312:51 →CoNsTaR:ion都是讓你能夠用「fp的方法」建構程式的要素,缺一07/1312:51 →CoNsTaR:個就無法獨立運作07/1312:51 →CoNsTaR:所以我才會說c++不支援fp(不能用fp的方法建構程式07/1312:51 →CoNsTaR:),因為三個裡面根本沒有一個支援,最接近fp的也只有07/1312:52 →CoNsTaR:higherorderfunction而已07/1312:52 推CoNsTaR:ifelse是對boolean做induction(elimination),pat07/1312:57 →CoNsTaR:ternmatching是對任何type的induction,意思是只要07/1312:57 →CoNsTaR:是type,就能夠被使用07/1312:57 推CoNsTaR:因為c++的bool來歷不明(你找不到bool這個type07/1313:12 →CoNsTaR:的definition),ifelse也來歷不明,你找不到ifels07/1313:12 →CoNsTaR:e的definition(形式化ifelse的方法),但在fp,這07/1313:12 →CoNsTaR:些都是可以用程式寫出來的(不是說寫一個編譯器,而是你07/1313:12 →CoNsTaR:要用bool你可以自己寫一個bool,你要patternmatchin07/1313:12 →CoNsTaR:g,你可以自己用Scottencoding),這個算是ifelse和07/1313:12 →CoNsTaR:patternmatching最大的差別07/1313:12 推CoNsTaR:*應該要說「寫出來的bool直接可以patternmatching」07/1313:32 →CoNsTaR:(不需要編譯器,你在紙筆上也可以做),這樣講比較好傳07/1313:32 →CoNsTaR:達GADT和patternmatching之間的關係07/1313:32 推MartinJ40:https://www.stroustrup.com/OpenPatternMatching.pdf07/1315:13 →MartinJ40:functionalprogramming跟CFG是等價07/1315:13 →MartinJ40:C++template跟turning是等價07/1315:14 →MartinJ40:怎麼可能Type-3做不出來Type-2文法.....07/1315:16 推CoNsTaR:......我不知道要講什麼了orz07/1316:35 →CoNsTaR:你真的知道你講的那些名詞是什麼意思嗎?07/1316:35 →CoNsTaR:關於那個library,等到它不用macro的時候再來嘴吧07/1316:35 推MartinJ40:我的意思是你提的那些特性是能先用template刻出來07/1317:01 →MartinJ40:只基於這些刻出來的物件去寫程式的話不就相當於07/1317:01 →MartinJ40:FP07/1317:01 →MartinJ40:用刻出來的這些元件再去作BOOLIFELSE07/1317:02 →MartinJ40:而非使用原本c++的關鍵字07/1317:02 推CoNsTaR:問題是TMP做不到這樣啊,TMP自己都做不到FP很多事07/1317:12 →CoNsTaR:情了,你怎麼會期待用它寫出來的元件可以magically把你07/1317:12 →CoNsTaR:的程式“變成”FP07/1317:12 推flarehunter:雖然已經偏離原來問題很遠了,不過難得在C++版有FP07/1317:55 →flarehunter:討論串XD我想繼續問以FP的角度會怎麼架構一個系統?07/1317:55 →flarehunter:GADT和patternmatching為什麼會是必要功能?Lisp07/1317:55 →flarehunter:是不是沒有這些功能啊?07/1317:55 →loveme00835:以為走錯板,原來是在討論AncientC++07/1318:37 推CoNsTaR:如果能接受英文的話可以看這個07/1318:39 →CoNsTaR:https://youtu.be/PLFl95c-IiU07/1318:39 →CoNsTaR:它標題雖然寫DDD可是其實是在講FP07/1318:39 →CoNsTaR:lisp我不會,但不一定非得GADT,GADT和patternmatch07/1318:39 →CoNsTaR:ing也都只是語法糖而已,別的類似的東西也可以07/1318:39 →CoNsTaR:如果你接受untyped的程式,你也可以完全不要任何類似G07/1318:39 →CoNsTaR:ADT或patternmatching的東西,就完全的function也07/1318:39 →CoNsTaR:是可以,但我認為大部分人說的FP不是那樣的東西07/1318:39 推CoNsTaR:那要請教一下L大HowmodernC++lookslike07/1318:48 →loveme00835:要嘴@MartinJ40的連結跟macro也先看一下[P1371]07/1319:05 →loveme00835:跟[P1221]的狀態,C++也是communitydrivenlang07/1319:07 →loveme00835:還要經過ISOcommiteereview,除了相容性要顧最重07/1319:09 →loveme00835:要的是"標準化"這件事.你喜歡其他語言是你的自由,07/1319:10 →loveme00835:但是在說"某語言都沒有什麼特性"前先搞清楚自己是07/1319:11 →loveme00835:不是真的熟悉它,然後如果覺得什麼特性很缺,你可以07/1319:12 →loveme00835:發提案,這就是howmodernC++lookslike07/1319:12 →loveme00835:看討論還以為是考古學有什麼重要發現07/1319:13 →loveme00835:簡單的說,不需要標準化的語言你想要什麼特性都很容07/1319:15 →loveme00835:易07/1319:15 推CoNsTaR:整理了一下:07/1319:42 →CoNsTaR:1.C++是地表最強語言,因為不論什麼功能沒有都只是目前07/1319:42 →CoNsTaR:沒有,什麼功能不好都只是目前不好,以後還是都會有,都07/1319:42 →CoNsTaR:會變好的07/1319:42 →CoNsTaR:2.要是真的不能有,也是因為相容性和標準化,才不是因07/1319:42 →CoNsTaR:為C++不支援07/1319:42 →CoNsTaR:我是不知道把語言的“狀況”寫在紙上叫它“標準”有什麼07/1319:42 →CoNsTaR:神奇的效果,但就我所知,所有的社群語言誰不是經過很多07/1319:42 →CoNsTaR:年的討論才會讓實作成為語言的一部分,語言的發展哪個沒07/1319:43 →CoNsTaR:有目標和提案,哪個不會考慮相容性07/1319:43 →CoNsTaR:如果有一個人跑來跟你說Haskell有dependenttypes,沒07/1319:43 →CoNsTaR:有dependenttypes的都是ancientHaskell你覺得如何07/1319:43 →CoNsTaR:?07/1319:43 推flarehunter:影片講得滿簡單清楚,有稍微理解FP的實際用處,謝謝07/1319:54 →flarehunter:影片裡的例子用C++的struct+enum也可以兜出來吧07/1319:55 推CoNsTaR:enum的確在有些狀況下可以做sumtype07/1320:01 →CoNsTaR:可以用struct(producttype,and)和inheritance(sum07/1320:01 →CoNsTaR:type,or)兜出來07/1320:01 →CoNsTaR:雖然這兩個東西本意應該也不是給你這樣用的就是了XD07/1320:01 推CoNsTaR:然後那個影片只是在講用FP做typing的方法,還是有很07/1320:04 →CoNsTaR:多其他東西是沒有講到的,所以真的用FPL寫程式的時候可07/1320:04 →CoNsTaR:能還是會有點陌生07/1320:04 →loveme00835:你已經幫我回答大部分的問題了.語言標準化尤其是IS07/1320:06 →loveme00835:O標準,最終都是為了服務業界.所以有關functional07/1320:06 →loveme00835:language的提案被reject是常有的事情,能用舊特07/1320:06 →loveme00835:性達成的功能,除非新特性可以做得更好更有"效率",07/1320:07 →loveme00835:否則它不會變成語言的一部分.標準化圍繞在軟體開發07/1320:07 →loveme00835:議題上;而不是發掘語言的可能性.所以前面才會說道07/1320:07 →loveme00835:先熟悉這個語言再來評論比較好07/1320:07 →loveme00835:這就好像討論為什麼魚沒有腳,所以和雞比牠絕對跑不07/1320:09 →loveme00835:快一樣.07/1320:09 →loveme00835:你來魚板不去了解為什麼魚不長腳,然後推廣雞有腳多07/1320:11 →loveme00835:棒不是很奇怪嗎?而且我從來沒有說過魚是最棒的生物,07/1320:11 →loveme00835:你的自然語言可能也有待加強.07/1320:11 推CoNsTaR:我會在這邊回是因為有人宣揚c++支援FP,你可能漏看前07/1320:14 →CoNsTaR:因後果了07/1320:14 →CoNsTaR:我不會沒事跑去跟不認識的人說某個語言沒有某個特性/功07/1320:14 →CoNsTaR:能,目前沒那麼無聊,謝謝07/1320:14 推CoNsTaR:而且fyi,就算你講的那兩個提案都通過了,c++仍然離支07/1320:16 →CoNsTaR:援FP非常遙遠07/1320:16 →CoNsTaR:至少我想不出有什麼提案的組合能夠讓c++支援FP又向07/1320:19 →CoNsTaR:後相容啦,可能我廢07/1320:19 推yoco:不該08/1523:38



請為這篇文章評分?