你们会向新人推荐 C++么?

2016 年 8 月 18 日
 xiqingongzi
/t/300012 提问 C++ 的路线图,很多人都在劝我放弃
但我是起意学 C++ 一方面是个人需要,另一方面是我的一个堂叔推荐我学 C++的。

什么样的情况下你会推荐别人学 C++ 。什么情况下不推荐 C++?

我觉得我堂叔不至于坑我吧....
13265 次点击
所在节点    C
174 条回复
muziki
2016 年 8 月 19 日
@lizon is 我觉得他的意思可能是说,因为 C/C++自身的某些缺陷和学习资料的水平问题会导致初学者希望通过学习 C/C++的同时了解底层知识的时候受到误导
与其学习 C/C++还不如学习“高级语言”,计算机底层知识没必要和特定语言绑定,想学就直接看底层的相关知识,否则初学者对底层的理解可能被带偏, C/C++本身学习成本和产出比较低,没那个必要
bramblex
2016 年 8 月 19 日
@lizon

对不起,教育只谈人性不谈技术。
kaneyuki
2016 年 8 月 19 日
@bramblex 我去个孔子学院出来就能写程序了?
kaneyuki
2016 年 8 月 19 日
@proudzhu 看见某人的回复要吐血了吧,哈哈。
所驳非所问这招到哪都是无敌的,你打不过的
bramblex
2016 年 8 月 19 日
@kaneyuki

教育是我教你,我要懂人性,懂了吗?你手下带过几个程序员?
FrankHB
2016 年 8 月 19 日
@kaneyuki 你先搞清楚答主的问题该答的上一页已经答完了再来水好不好。
现在的焦点明显是给上一页的某些回复擦屁股避免不确定的影响。

嘛,需要小尾巴广告的话——照例专业治疗各种自以为学会 C 的癔病。
FrankHB
2016 年 8 月 19 日
另外补一句,我来义务诊疗并非因为我闲着没事干或者热衷慈善,而是因为太多被带沟里的厨余发酵着让业界发馊了碍着我了,基于利益考量,我有必要采取减少我潜在工作量的对策罢了。

没搞清楚扯啥的搪塞的还是趁早闭嘴比较能节约双方时间。
proudzhu
2016 年 8 月 19 日
@FrankHB 不是科班的,我表达的”优化“指的是“不需要你自己完成,编译器完成的",表达有误,见谅。
我们讨论的问题不是理解指针吗? Sum Type 是在看 Haskell 时了解的,谢谢让我了解了 C 实现的 tagged union ,但是这个实现难道不需要理解指针?所以到底应该怎么理解指针?别说指针是语言设计的错误。
x8
2016 年 8 月 19 日
@muziki 嗯,了解。
我的意思是:初学者只需要把 C 语言当成一个纯粹的工具,了解底层,做实验的工具,并没有上升到语言本身的问题上,我其实也不关心 C 语言语义上的东西。作为初学者了解底层的起手工具, C 语言最合适。
带偏是难免的,任何资料都可能存在误导,遇到问题了,初学者自己要学会查问题,做实验,和别人交流,验证想法。
我希望初学者通过学习 C 语言,通过遇到问题解决问题,学到其他更有用的东西,比如“底层封装得并不完美”,“编译器并不能保证程序的正确性”,永远保持向下探究的态度,顺带还有一大票的底层知识,而不单单只是学一门程序语言的语法语义。
kaneyuki
2016 年 8 月 19 日
@FrankHB 我只是看到一些连叙述者的意思都理解的所驳非所论而已。
您专治各种癔病的郎中班继续开,不多打扰。
proudzhu
2016 年 8 月 19 日
@kaneyuki 那没办法,非科班的表示还没了解到这么多的程序语言相关的概念,无奈脸
kaneyuki
2016 年 8 月 19 日
@bramblex 带了三届了,怎么了?
FrankHB
2016 年 8 月 19 日
@proudzhu 你的误解应该综合来源于几个方面。
须知:
1.底层( ISA 设计提供的)的指针,一般就是有特别含义的地址。
2.C 所谓的指针和上面所谓的指针根本不是一回事。
3.这两者在实现上是有些关系,但不需要倒腾二进制互操作的用户(显然包括绝大多数新手),附会只是添乱。
4.大部分用户没有机会也不必要同时接受把这些东西理解得面面俱到的系统训练。
只有绝对少数领域(像实现 CPU 的、做编译器的、维护系统 ABI 的、在这个层次以下逆向的、因为目前 ISA 抽象混乱做 OS 不得不在这个层次上 hack 的……)的实现者和设计人员中的 architect 才有必要把这些都理解清楚。
相对来讲,只学高级语言,忘记“指针就是地址”符合更一般语言用户的需求。
先钦定指针=地址,根本就是搞错问题领域了。我当作误导,不算冤枉吧?
x8
2016 年 8 月 19 日
@bramblex 我不认为学习问题是教育问题,很多时候需要自学,交流,做实验,自己验证想法。不是每个初学者都有机会等到大牛根据人性的悉心指导,自力更生更重要。这个道理越早理解越好。
bramblex
2016 年 8 月 19 日
@kaneyuki

那你还不懂得怎么培养人?怎么把不积极的程序员的兴趣调动起来?当然啦,反正如果只是当砖不培养的话当我没说过。
bramblex
2016 年 8 月 19 日
@bramblex

自己学习没错,但是培养手下是另一码事了好吧。两个都要做的,光自己学习有个蛋用,一个人的力量多有限?
bramblex
2016 年 8 月 19 日
不撕了,干正事了……
FrankHB
2016 年 8 月 19 日
@proudzhu 很遗憾,我还真找不出“不是错误”的借口。这是让实现细节倒置到接口之上的典型 leady abstraction ,怎么看都是设计上的经典反面教材,只是各种不明真相的群众以讹传讹说成了“精华”,也是无语。
改正这个问题最简单的做法就是直接提供底层的指针代替现在的指针,可以实现为整数或者加上一些检查的地址类型(也可以考虑提供地址偏移量类型),于是“(对象)指针就是(可选的)地址”成了真命题,符合一些用户的预期。而现在 C 那种指针应该被废弃,非要兼容也应该弱化为库来提供而不是语言内建。这样语言规范里的废话也能转移出去一大坨,二进制兼容性维护起来也方便得多。
然而很遗憾, C 在参数化类型上的开洞导致这种改动必须另加很基本的核心语言特性而不现实(不像 C++有模板加上一个扩展标识符占位就立刻能凑数)。所以估计接下来几十年将错就错还是主流了。
proudzhu
2016 年 8 月 19 日
@FrankHB 如果我记得没错的话,程序都是访问的是虚拟地址空间,和真实硬件的地址是映射关系,我们说的 C 里的指针是指向这些虚拟地址空间的。
我当然知道高级语言的用户不需要了解这些,但是我们现在讨论的不就是怎么理解指针吗?
还是认为指针=地址,搞 DSP 的时候也和这个理解一致,求科班人士拍醒。
FrankHB
2016 年 8 月 19 日
@proudzhu 你要知道 C 这种人为设计的东西,通过对“指针”这个术语的明确的定义和拒绝提及其它义项,就完美地把“指针”在其它领域的本义覆盖掉了。所以光是讨论 C ,你只有一个无歧义的“指针”的概念。如果你需要同时讨论更底层的某些 ISA 中定义的指针,那还不如直接说“地址”更清楚,不需要无谓增加同义词和混乱。(你也不方便随便发明一个新概念代替 C 所谓的“指针”了,加上“智能指针”这类派生,“指针”这个词在一般场合是保留给高级语言的。)

而虚拟地址空间是另外一层抽象,通常比 C 实现的层次更低。不算 WG14 某些扩展提案, C 本身不对地址空间做任何抽象(其实根本就没提什么地址空间), ISA 和一些硬件 spec 倒是会提到支持,所以提虚拟地址空间实际上已经是 C 以下的底层话题了。排除高级语言这个意义上讨论“指针”的含义反倒比上面明确,虽然我仍然更愿意看到“地址”这样无歧义的表述。(嘛,严格来说上面所有的地址特指 memory byte address ,不过一般人也不会没事倒腾寄存器编址什么的……)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://v2ex.ih06.com/t/300102

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX