[讨论] 该学习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