作者Matz (イラマチオ研究员)
看板C_and_CPP
标题[讨论] 该学习C++吗?
时间Wed Jul 8 19:13:21 2020
本鲁一个弱弱的资工本科生。
在学校学过C、Java、javascript。
但後面两个课上完後就没碰过了(几乎忘光)。
平常都是写C(一些小游戏、刷题)
专题也是用C语言。
想问如果单纯专攻C语言,对未来就业好吗?
还是需要搭配别的语言会比较好?
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 1.171.72.222 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1594206803.A.5F9.html
1F:→ james732: 把你学过的这三个摸到精熟的话就非常厉害了 07/08 19:44
2F:→ Schottky: 光靠精通 C 语言就能赚饱饱了 07/08 19:56
3F:→ Schottky: 要不要学其他的语言看你自己高兴,并不是必要的 07/08 19:59
4F:推 Killercat: C要精通很难 要靠这精通赚饱更难 可以看看硬体厂薪资 07/08 22:32
5F:→ Killercat: C++机会还大一点 凭良心说 XD 07/08 22:33
6F:推 Clangpp: c++才比较难学吧... 07/09 01:02
7F:推 Schottky: 如果你看到可以拿 C 刷题的人说自己弱,千万别相信他。 07/09 02:08
8F:推 expiate: 刷题用 c那几乎资料结构都是手刻的阿!神! 07/09 06:12
9F:→ Feis: 用 C 写 LeetCode 的话,如果不要求一次过的话,个人经验是 07/09 07:37
10F:→ Feis: 不会特别难。只是看目的 07/09 07:37
11F:→ Feis: 比较麻烦的主要是 I/O 处理 07/09 07:38
12F:→ Feis: 但刚好 LeetCode 比较少这问题 07/09 07:39
13F:→ Killercat: 不过以就业来讲 台湾C除非顶尖 不然就是吃不饱饿不死 07/09 09:32
14F:→ Killercat: 为了就业而想多学的语言来讲 我个人比较推java跟go 可 07/09 09:46
15F:→ Killercat: 以试试看这两个 07/09 09:46
16F:推 lc85301: 不用,学 rust(欸 07/09 10:25
17F:推 MartinJ40: 爱惜生命远离java/c++ 要也是python rust这些新兴语言 07/09 10:38
18F:→ MartinJ40: 想走前後端js 07/09 10:39
19F:→ MartinJ40: C++拥有所有paradigm 怎麽可能比C简单 07/09 10:41
20F:→ MartinJ40: 光template就是一个语言的难度 07/09 10:42
21F:→ Killercat: er..我说的C++机会大一点 是说「赚饱的机会」不是说好 07/09 11:22
22F:→ Killercat: 学。java是满蓝海的说真的,但是position目前来看还是 07/09 11:23
23F:→ Killercat: 很多,go的话是真的不错,rust也赞但是目前机会较少 07/09 11:23
24F:→ cphe: 用C刷光是刻资料结构就饱了,刻完才是真正开始解题 07/09 12:42
感谢各位大大的建议了。
※ 编辑: Matz (122.116.159.149 台湾), 07/09/2020 16:35:04
25F:推 aecho: 啊呜…就业的话…资料结构与演算法要学好呀 -.- 07/09 16:54
26F:→ aecho: 如果有教资料库的话,那个ACID也要好好搞懂呀 Orz 07/09 16:56
27F:→ aecho: 进职後被丢去学MFC, C#, Obj-C 都是一堆学校没教过的 07/09 16:57
28F:推 Schottky: 平常好像不会听到有人劝开战斗机的去开计程车就好 07/09 19:01
29F:推 CoNsTaR: 系统语言 rust 最赞没有之一 07/10 00:44
30F:推 KanzakiHAria: 不会有人想特地学战斗机目的是找工作啊 07/10 08:42
31F:→ KanzakiHAria: 想就业最多也是民航飞机 怎麽样都不会是战斗机 07/10 08:42
32F:推 Schottky: 如果还没学,我同意。但人家已经开着战斗机飞来飞去了 07/10 11:13
33F:→ Schottky: 然後你跟他说计程车的职缺比较多去学开计程车 07/10 11:13
34F:→ Killercat: C...战斗机喔... 好吧,只能说我尊重你的看法 XD 07/10 14:55
35F:→ Killercat: 人家就是问就业问题 当然就以市场来回答啊... 07/10 14:55
36F:→ Killercat: C在就业市场的确「相对没那麽强势」也是事实吧 07/10 14:57
37F:→ petercoin: 台湾高薪的软体相关职缺还是IC厂韧体居多吧? 07/11 00:08
38F:推 Dracarys: S大描述的真传神XD 07/11 00:08
39F:推 loveme00835: 人活得好好地为什麽要学希佳佳呢 Q_Q 07/11 01:53
40F:→ alex70266: 看就业的方向是哪种吧,往韧体/嵌入式走的话 07/11 16:09
41F:→ alex70266: 不太会C还是很痛苦的 07/11 16:10
42F:→ alex70266: 不过去摸点C++不是什麽坏事啦 07/11 16:14
43F:推 flarehunter: 我觉得不用执着语言,学点不同思考的方法,像是FP, 07/11 21:36
44F:→ flarehunter: OOP, 设计模式, 软体工程,推荐看clean code系列书 07/11 21:36
45F:推 flarehunter: 反正出社会工作八成是没学过的事,练基础功总是有用 07/11 21:40
46F:推 flarehunter: M大说C++有所有范式,所以用C++学这些范式也不错 07/11 21:48
47F:推 ddavid: 就算C真的是战斗机好了,你也要真的开得好才会赚得来,只 07/11 23:36
48F:→ ddavid: 是会开的话,升空也就是被打下来的分 07/11 23:37
49F:推 bben900911: 看起来对C颇有心得。 去IC厂当韧体写C,薪水不错吧? 07/12 00:09
50F:推 CoNsTaR: C++ 有所有范式反对一票,光是 fp 就没有了 07/13 07:06
51F:推 flarehunter: 有c++11开始有lambda也可以传来传去 可以算有fp吧? 07/13 08:45
52F:推 CoNsTaR: 这和 fp 说他们有 first class module(或 record)存 co 07/13 08:59
53F:→ CoNsTaR: ntext,可以算 OOP 有什麽不同 XD 07/13 08:59
54F:推 ray2501: 不就有 lambda calculus,然後可以函式输出和输入,就算 07/13 10:23
55F:→ ray2501: 有初步支援了吗? 从定义上来看,C++ 是有支援啊 07/13 10:23
56F:推 flarehunter: 如果可以支援多型来达到依赖反转,我就觉得算是OOP吧 07/13 10:52
57F:→ loveme00835: 用 OOP/SOLID 来考虑学 C++ 是否搞错什麽 xD C++ 的 07/13 10:59
58F:→ loveme00835: 特色又不是 OO 07/13 10:59
59F:推 flarehunter: 我也是觉得语言不重要 重要的是那些概念 07/13 11:03
60F:→ Killercat: 事实上C++的OO还满薄弱的 不过因为有template,所以 07/13 11:04
61F:→ Killercat: metaprogramming下的弹性简直是作弊 07/13 11:04
62F:→ Killercat: 没interface 没object 说真的要当真正的OO还有段路XD 07/13 11:04
63F:→ Killercat: 拿来学一些当infrastructure library的东西倒是赞 07/13 11:05
64F:→ Killercat: 看看那个Loki::SingletonHolder写得多弹性 XD 07/13 11:06
65F:→ Killercat: 重点是还真的易用 超易用 07/13 11:06
66F:→ Killercat: 目前还没看过哪种别的语言(可能除了C的macro外)可以把 07/13 11:07
67F:→ Killercat: infrastructure library做得那麽有弹性且好用的 07/13 11:07
68F:推 CoNsTaR: @ray2501 有 lambda calculus 是个什麽说法 orz 07/13 11:07
69F:→ CoNsTaR: 可以函数输入输出又是什麽说法 orz 07/13 11:07
70F:→ CoNsTaR: 你的定义怎麽好像跟别人都不太一样 XD 07/13 11:08
71F:推 CoNsTaR: @Killercat Agda 呢?连 reflection 都是用自己写的 07/13 11:13
72F:→ Killercat: 好吧那应该是我看过的语言不够多 :P 07/13 11:16
73F:→ Killercat: 不过我想主流语言里面应该C++这点是近乎无敌了 07/13 11:16
74F:推 flarehunter: @CoNsTaR 你认为的FP应该有哪些概念啊? 07/13 11:20
75F:推 CoNsTaR: 如果要“成为”一个 FP 语言,最重要的前提是必须是 decl 07/13 11:36
76F:→ CoNsTaR: arative 吧,或至少在某些范围内是 declarative,或者就 07/13 11:36
77F:→ CoNsTaR: 算做不到也要有一些 compromise 的产物,例如 rust 的 mu 07/13 11:36
78F:→ CoNsTaR: table 之类的 07/13 11:36
79F:→ CoNsTaR: 如果只是想要“支援 FP”最重要的就是要有 GADT 去配合某 07/13 11:36
80F:→ CoNsTaR: 种 exhaustive check(例如 pattern matching in terms o 07/13 11:37
81F:→ CoNsTaR: f pattern calculus,或是 Scott、Church encoding in te 07/13 11:37
82F:→ CoNsTaR: rms of lambda calculus),和 first class function 07/13 11:37
83F:推 CoNsTaR: *某种类似 GADT 去配合某种 exhaustive check 07/13 11:39
84F:推 ray2501: 第一步是 First-class and higher-order functions,可以 07/13 11:53
85F:→ ray2501: 接受函式当作输入输出,这 c++ 早就有了,你的定义才奇怪 07/13 11:54
86F:推 CoNsTaR: 我不是故意要在 c/cpp 版讨论 fp(你可以去 PLT 版开一篇 07/13 12:04
87F:→ CoNsTaR: ,我或其他大大可以在那里回你),只是如果真的是 first 07/13 12:04
88F:→ CoNsTaR: class,有可能会不是 higher order 吗?为什麽要分成两 07/13 12:04
89F:→ CoNsTaR: 个条件? 07/13 12:04
90F:→ CoNsTaR: 然後既然是 first class,为什麽 c++ 不能有 flip 和 par 07/13 12:04
91F:→ CoNsTaR: tial application?(我知道有 bind) 07/13 12:04
92F:推 CoNsTaR: 解释一下,我说的「类似 GADT 去配合某种 exhaustive che 07/13 12:15
93F:→ CoNsTaR: ck」是打造 first class 函数的其中一种方法,只有用这 07/13 12:15
94F:→ CoNsTaR: 种方法产生函数的语言才能算是某种 FP 07/13 12:15
95F:推 flarehunter: 我理解的范式是指如何思考程式架构的方法,像是结构化 07/13 12:36
96F:→ flarehunter: 能够divide and conquer, OOP可以用多型控制依赖方向 07/13 12:38
97F:推 flarehunter: FP我就不熟,只有理解到可以用小函式组合出大函式和 07/13 12:42
98F:→ flarehunter: 分离有side effect的部份让平行化顺利一点 07/13 12:43
99F:→ flarehunter: 感觉你提的都有点像是语言特性,不是FP范式必要功能? 07/13 12:44
100F:→ flarehunter: pattern matching和if else在程式架构上有什麽差异? 07/13 12:47
101F:推 CoNsTaR: 我也是啊(程式架构的方法),所以我开头就说了必须是 de 07/13 12:51
102F:→ CoNsTaR: clarative 07/13 12:51
103F:→ CoNsTaR: 後来提的 GADT,pattern matching,和 first class funct 07/13 12:51
104F:→ CoNsTaR: ion 都是让你能够用「fp 的方法」建构程式的要素,缺一 07/13 12:51
105F:→ CoNsTaR: 个就无法独立运作 07/13 12:51
106F:→ CoNsTaR: 所以我才会说 c++ 不支援 fp(不能用 fp 的方法建构程式 07/13 12:51
107F:→ CoNsTaR: ),因为三个里面根本没有一个支援,最接近 fp 的也只有 07/13 12:52
108F:→ CoNsTaR: higher order function 而已 07/13 12:52
109F:推 CoNsTaR: if else 是对 boolean 做 induction(elimination),pat 07/13 12:57
110F:→ CoNsTaR: tern matching 是对任何 type 的 induction,意思是只要 07/13 12:57
111F:→ CoNsTaR: 是 type,就能够被使用 07/13 12:57
112F:推 CoNsTaR: 因为 c++ 的 bool 来历不明(你找不到 bool 这个 type 07/13 13:12
113F:→ CoNsTaR: 的 definition),if else 也来历不明,你找不到 if els 07/13 13:12
114F:→ CoNsTaR: e 的 definition(形式化 if else 的方法),但在 fp,这 07/13 13:12
115F:→ CoNsTaR: 些都是可以用程式写出来的(不是说写一个编译器,而是你 07/13 13:12
116F:→ CoNsTaR: 要用 bool 你可以自己写一个 bool,你要 pattern matchin 07/13 13:12
117F:→ CoNsTaR: g,你可以自己用 Scott encoding),这个算是 if else 和 07/13 13:12
118F:→ CoNsTaR: pattern matching 最大的差别 07/13 13:12
119F:推 CoNsTaR: *应该要说「写出来的 bool 直接可以 pattern matching」 07/13 13:32
120F:→ CoNsTaR: (不需要编译器,你在纸笔上也可以做),这样讲比较好传 07/13 13:32
121F:→ CoNsTaR: 达 GADT 和 pattern matching 之间的关系 07/13 13:32
123F:→ MartinJ40: functional programming跟CFG是等价 07/13 15:13
124F:→ MartinJ40: C++ template跟turning是等价 07/13 15:14
125F:→ MartinJ40: 怎麽可能Type-3做不出来Type-2文法..... 07/13 15:16
126F:推 CoNsTaR: ...... 我不知道要讲什麽了 orz 07/13 16:35
127F:→ CoNsTaR: 你真的知道你讲的那些名词是什麽意思吗? 07/13 16:35
128F:→ CoNsTaR: 关於那个 library,等到它不用 macro 的时候再来嘴吧 07/13 16:35
129F:推 MartinJ40: 我的意思是 你提的那些特性 是能先用template刻出来 07/13 17:01
130F:→ MartinJ40: 只基於这些刻出来的物件去写程式的话 不就相当於 07/13 17:01
131F:→ MartinJ40: FP 07/13 17:01
132F:→ MartinJ40: 用刻出来的这些元件再去作 BOOL IF ELSE 07/13 17:02
133F:→ MartinJ40: 而非使用原本c++的关键字 07/13 17:02
134F:推 CoNsTaR: 问题是 TMP 做不到这样啊,TMP 自己都做不到 FP 很多事 07/13 17:12
135F:→ CoNsTaR: 情了,你怎麽会期待用它写出来的元件可以 magically 把你 07/13 17:12
136F:→ CoNsTaR: 的程式“变成” FP 07/13 17:12
137F:推 flarehunter: 虽然已经偏离原来问题很远了,不过难得在C++版有FP 07/13 17:55
138F:→ flarehunter: 讨论串XD 我想继续问以FP的角度会怎麽架构一个系统? 07/13 17:55
139F:→ flarehunter: GADT和pattern matching为什麽会是必要功能? Lisp 07/13 17:55
140F:→ flarehunter: 是不是没有这些功能啊? 07/13 17:55
141F:→ loveme00835: 以为走错板, 原来是在讨论 Ancient C++ 07/13 18:37
142F:推 CoNsTaR: 如果能接受英文的话可以看这个 07/13 18:39
144F:→ CoNsTaR: 它标题虽然写 DDD 可是其实是在讲 FP 07/13 18:39
145F:→ CoNsTaR: lisp 我不会,但不一定非得 GADT,GADT 和 pattern match 07/13 18:39
146F:→ CoNsTaR: ing 也都只是语法糖而已,别的类似的东西也可以 07/13 18:39
147F:→ CoNsTaR: 如果你接受 untyped 的程式,你也可以完全不要任何类似 G 07/13 18:39
148F:→ CoNsTaR: ADT 或 pattern matching 的东西,就完全的 function 也 07/13 18:39
149F:→ CoNsTaR: 是可以,但我认为大部分人说的 FP 不是那样的东西 07/13 18:39
150F:推 CoNsTaR: 那要请教一下 L 大 How modern C++ looks like 07/13 18:48
151F:→ loveme00835: 要嘴 @MartinJ40 的连结跟 macro 也先看一下 [P1371] 07/13 19:05
152F:→ loveme00835: 跟 [P1221] 的状态, C++ 也是 community driven lang 07/13 19:07
153F:→ loveme00835: 还要经过 ISO commitee review, 除了相容性要顾最重 07/13 19:09
154F:→ loveme00835: 要的是 "标准化" 这件事. 你喜欢其他语言是你的自由, 07/13 19:10
155F:→ loveme00835: 但是在说 "某语言都没有什麽特性" 前先搞清楚自己是 07/13 19:11
156F:→ loveme00835: 不是真的熟悉它, 然後如果觉得什麽特性很缺, 你可以 07/13 19:12
157F:→ loveme00835: 发提案, 这就是 how modern C++ looks like 07/13 19:12
158F:→ loveme00835: 看讨论还以为是考古学有什麽重要发现 07/13 19:13
159F:→ loveme00835: 简单的说, 不需要标准化的语言你想要什麽特性都很容 07/13 19:15
160F:→ loveme00835: 易 07/13 19:15
161F:推 CoNsTaR: 整理了一下: 07/13 19:42
162F:→ CoNsTaR: 1. C++ 是地表最强语言,因为不论什麽功能没有都只是目前 07/13 19:42
163F:→ CoNsTaR: 没有,什麽功能不好都只是目前不好,以後还是都会有,都 07/13 19:42
164F:→ CoNsTaR: 会变好的 07/13 19:42
165F:→ CoNsTaR: 2. 要是真的不能有,也是因为相容性和标准化,才不是因 07/13 19:42
166F:→ CoNsTaR: 为 C++ 不支援 07/13 19:42
167F:→ CoNsTaR: 我是不知道把语言的“状况”写在纸上叫它“标准”有什麽 07/13 19:42
168F:→ CoNsTaR: 神奇的效果,但就我所知,所有的社群语言谁不是经过很多 07/13 19:42
169F:→ CoNsTaR: 年的讨论才会让实作成为语言的一部分,语言的发展哪个没 07/13 19:43
170F:→ CoNsTaR: 有目标和提案,哪个不会考虑相容性 07/13 19:43
171F:→ CoNsTaR: 如果有一个人跑来跟你说 Haskell 有 dependent types,没 07/13 19:43
172F:→ CoNsTaR: 有 dependent types 的都是 ancient Haskell 你觉得如何 07/13 19:43
173F:→ CoNsTaR: ? 07/13 19:43
174F:推 flarehunter: 影片讲得满简单清楚,有稍微理解FP的实际用处,谢谢 07/13 19:54
175F:→ flarehunter: 影片里的例子用C++的struct+enum也可以兜出来吧 07/13 19:55
176F:推 CoNsTaR: enum 的确在有些状况下可以做 sum type 07/13 20:01
177F:→ CoNsTaR: 可以用 struct(product type,and)和 inheritance(sum 07/13 20:01
178F:→ CoNsTaR: type,or)兜出来 07/13 20:01
179F:→ CoNsTaR: 虽然这两个东西本意应该也不是给你这样用的就是了 XD 07/13 20:01
180F:推 CoNsTaR: 然後那个影片只是在讲用 FP 做 typing 的方法,还是有很 07/13 20:04
181F:→ CoNsTaR: 多其他东西是没有讲到的,所以真的用 FPL 写程式的时候可 07/13 20:04
182F:→ CoNsTaR: 能还是会有点陌生 07/13 20:04
183F:→ loveme00835: 你已经帮我回答大部分的问题了. 语言标准化尤其是 IS 07/13 20:06
184F:→ loveme00835: O 标准, 最终都是为了服务业界. 所以有关 functional 07/13 20:06
185F:→ loveme00835: language 的提案被 reject 是常有的事情, 能用旧特 07/13 20:06
186F:→ loveme00835: 性达成的功能, 除非新特性可以做得更好更有 "效率", 07/13 20:07
187F:→ loveme00835: 否则它不会变成语言的一部分. 标准化围绕在软体开发 07/13 20:07
188F:→ loveme00835: 议题上; 而不是发掘语言的可能性. 所以前面才会说道 07/13 20:07
189F:→ loveme00835: 先熟悉这个语言再来评论比较好 07/13 20:07
190F:→ loveme00835: 这就好像讨论为什麽鱼没有脚, 所以和鸡比牠绝对跑不 07/13 20:09
191F:→ loveme00835: 快一样. 07/13 20:09
192F:→ loveme00835: 你来鱼板不去了解为什麽鱼不长脚, 然後推广鸡有脚多 07/13 20:11
193F:→ loveme00835: 棒不是很奇怪吗? 而且我从来没有说过鱼是最棒的生物, 07/13 20:11
194F:→ loveme00835: 你的自然语言可能也有待加强. 07/13 20:11
195F:推 CoNsTaR: 我会在这边回是因为有人宣扬 c++ 支援 FP,你可能漏看前 07/13 20:14
196F:→ CoNsTaR: 因後果了 07/13 20:14
197F:→ CoNsTaR: 我不会没事跑去跟不认识的人说某个语言没有某个特性/功 07/13 20:14
198F:→ CoNsTaR: 能,目前没那麽无聊,谢谢 07/13 20:14
199F:推 CoNsTaR: 而且 fyi,就算你讲的那两个提案都通过了,c++ 仍然离支 07/13 20:16
200F:→ CoNsTaR: 援 FP 非常遥远 07/13 20:16
201F:→ CoNsTaR: 至少我想不出有什麽提案的组合能够让 c++ 支援 FP 又向 07/13 20:19
202F:→ CoNsTaR: 後相容啦,可能我废 07/13 20:19
203F:推 yoco: 不该 08/15 23:38