1
wangxn 2016-08-18 11:14:35 +08:00
这东西不用推荐。
我们本科时大一学 C++,大二学 Java 。这时候就会出现分流了,有的人认同 C++,那么他以后技术栈就是以 C++ 为主了,否则多半是 Java 。其他自学了 PHP 、 JavaScript 的,我觉得是个人兴趣。 |
2
UnisandK 2016-08-18 11:14:55 +08:00
C++新人找工作比较蛋疼
|
3
wangxn 2016-08-18 11:16:03 +08:00
单纯学某一种技术没用。必须是实际用得上才行,比如刷题或者项目用得上。不用的话,看过没几天就忘了,还不如不学,尽力加强自己学习或者工作中用得上的那些技术。
|
4
jimzhong 2016-08-18 11:17:04 +08:00
如果要刷 OI ,做高性能计算,写 OpenCV ,写桌面应用和游戏,还是推荐 C++的。
但是如果要 Web 开发或者 Android 开发那么还是 Java 比较好。 |
5
wangxn 2016-08-18 11:18:45 +08:00
@UnisandK 现在互联网公司差不多都不用 C++。百度和腾讯以及大部分游戏公司还是主要用 C++。
但学了 C++,上手其他语言也很快。比如 Go ,看几天应该就能直接在项目中用了。 |
6
cgcgbcbc 2016-08-18 11:21:04 +08:00
在学校写了两年 c++,再看一看什么 llvm 之类的代码,发现自己并不会写 c++,👋
|
7
tomz 2016-08-18 11:24:15 +08:00
用 haxe ,可以减少写 c++。
|
8
inisun 2016-08-18 11:24:20 +08:00 via iPhone
一开始学 C++很容易失去对编程的兴趣,第一门语言还是简单点,培养兴趣比较好
|
9
xiqingongzi OP |
10
hitmanx 2016-08-18 11:30:47 +08:00
刚好在你那个贴里也回了。我自己日常工作语言是 c++,但是如果身边有人新学编程,我一般会推荐 python 。
|
11
Tianqi 2016-08-18 11:32:54 +08:00
同楼上,不建议第一门学 C++, c++感觉细枝末节太多,功能上其实比其他流行语言是要少的。如果喜欢做游戏等可以作为第二门语言来学
|
12
bramblex 2016-08-18 11:33:15 +08:00 2
看你怎么定义这个“新人”,不过一般不建议新人上来就折腾 C/C++ 。 C/C++ 非常依赖计算机基础,学 C/C++学了一年了还只会写个没有什么实际用处的黑框框程序真是大有人在。如果是计算机科班学生倒还好说,反正课程要求强制要学下去,不学下去毕不了业。如果不是计算机科班学生,学了一年屁东西都没学出来,几个人还有毅力能坚持下去?
引新人入门要权衡 “即时回报” 和 “长远回报”,光考虑 “长远回报” 新人连门都不见得能入得了就放弃了,光考虑 “即时回报” 会限制新人以后的发展高度。这是要权衡好的。 我个人的建议就是先用一些简单能马上看到效果的东西引新手入门,比如 JavaScript ,然后再辅以计算机基础的学习。新人上来就学 C/C++ 十有八九三个月后这新人就弃坑了…… |
13
aias 2016-08-18 11:33:29 +08:00
新人学了 c++,然后就没有然后了。
|
14
Andiry 2016-08-18 11:36:16 +08:00
不要把 C 和 C++混为一谈,两门完全不同的语言没有可比性。 C 简单太多了。
|
15
Mrun 2016-08-18 11:40:55 +08:00 1
没有编程基础,上手语言就不要学 C++,很多新手程序员对这个有种迷之自信,把书翻两遍就能学好 C++了
|
16
acros 2016-08-18 11:44:06 +08:00
你把 C++和算法看成同样的东西···
不指望精通,但是学了后,再学其他语言总是带加成的。 |
18
Tom008 2016-08-18 11:53:19 +08:00
不赞成,可以学 php 或者 java , c++的岗位太少了,你让别人学了,找不到工作怎么搞!
|
19
shyling 2016-08-18 11:54:37 +08:00
学 C/C++学了一年了还只会写个没有什么实际用处的黑框框程序真是大有人在。
+1 |
20
xiqingongzi OP |
21
owt5008137 2016-08-18 12:01:49 +08:00 via Android
C++上手慢,需要大量计算机基础。如果不能保持专研和保持时间投入的话是看不到什么成果的。
当然如果 C++有一定积累之后的好处是,学什么其他东西都可以从原理直接入手而比较快。 所以,如果对没有兴趣或者持续投入的决心的人,我不会推荐他 /她学 C++。 |
22
FrankHB 2016-08-18 12:20:26 +08:00 3
新人到什么程度?
基本上所有的工业级 C-like 的语言都不适合多数没有计算机科学(史)常识的新人。因为这些语言就不是设计出来服务新人入门的,坑的种类数不清,靠经验扛太耗青春。加上这方面优越感爆棚的半吊子和烂文献资料无数,很可能一知半解就学傻了,事后遇到其它需求还得回头再忘掉一些民科知识。 如果有其它语言的经验,仍然不推荐 C++,因为 C++的坑异于常人。只不过有些任务没有其它更合适的情况下不得不硬着头皮上而已。 想自己照搬设计通用目的语言的,参考 C++倒是优先于参考 C 和其它标准更不完备的语言。但有这种需求的不算是一般所谓的新人了吧。 |
23
FrankHB 2016-08-18 12:23:42 +08:00 2
不管是不是新人,是不是业内人士,是不是混饭,用到什么就学什么(但不要什么都信,须知设计者的智商和见识也是有上限的,别太早认定就是最优方案)是关于此类风险最小的一般策略。
|
24
FrankHB 2016-08-18 12:31:13 +08:00
@xiqingongzi 你叔叔推荐你 C++可能有那么几个原因:
当时 C++风头正健,“流行”,“学会”了不担心饿死(事实证明这个基本上不靠谱); C++啥都能干(这个对新手来说一般不靠谱); 他见识到的领域没有其它更合适的语言。 比较合理的理由是最后一个。以前选择余地少,所以能适应领域广的语言就是合适的语言,在 Lisp 怂了的情况下 C++基本没什么对手;新的适合特定领域语言不断出现之后这种情况就比较少了。 现在的情况是某种古董语言有相当一部分领域基本不可能被取代,所以学起来是有前途的——如果你对该领域任务感兴趣的话。 |
25
AlexH 2016-08-18 13:02:29 +08:00 via Android
@FrankHB 用到什么就学什么,说的太好了。感同身受。更不要说现在看似网络信息唾手可得其实是身处信息垃圾的海洋中,作为一个没人指导的新人光是自己把自己捞出这个垃圾海洋都快要耗尽心力。
|
26
xuyuheng0905 2016-08-18 13:16:33 +08:00
四年 C++经验飘过。 C++细节(坑)多,难精通,需要大量实践。如果你是新手,有其他选择的话,就不用考虑 C++,除非你想找这方面开发经验,或者自己特别喜欢 C++,或者已经学了一段时间了,打算靠这方面工作谋生。最后还要说一点,只懂 C++肯定不够的。
|
27
wshcdr 2016-08-18 13:17:18 +08:00
不建议。
|
28
noli 2016-08-18 13:19:45 +08:00
不会推荐 C++。推荐 PASCAL ,虽然一点也不实用。
|
29
NonPainter 2016-08-18 13:22:02 +08:00
我公司的程序员在我问他我想学编程要从什么语言入手的时候,他说你要先想好自己编程要干什么,然后就不用面临挑选语言的问题了,你要想用 UE4 ,乖乖去学 C++,如果用 unity ,就从 C#学起,如果想做自己的网站,就从 web 语言开始学
|
30
panlilu 2016-08-18 13:22:18 +08:00 via iPhone
不会😅
|
31
zwpaper 2016-08-18 13:22:37 +08:00 via iPhone
看到有说是学生,作为刚入职场的我,建议就是自己喜欢什么就学呗,只要起码会一门大语言,面试可以用。
其他的工作时候能不能用上都是两说 |
32
zhuangzhuang1988 2016-08-18 13:32:32 +08:00
会。
|
33
dtfm 2016-08-18 13:35:26 +08:00
脱离具体环境谈论是否推荐 C++ 没有意义,人和人差别是很大的。
就像知乎上某些人,人家一个非 CS 专业中途转行就想快速学习找到一份工作,非去推荐别人学 C++ / 算法,有人推荐 Python 、前端之类上手快的还不乐意,说不利于了解底层。 这比那些向 JAVA 初学者推荐 JAVA 编程思想的人还可恶,简直误人子弟。 |
34
geek123 2016-08-18 13:46:19 +08:00
不推荐。
|
35
xiqingongzi OP @dtfm 那么什么样的人和环境下你会推荐?
|
36
likeyou 2016-08-18 14:08:59 +08:00
不推荐 ,先学点简单易懂的倒可以。比如, Java 、 HTML
|
37
xiaowangge 2016-08-18 14:47:38 +08:00
国内的话,哈工大、上交大,已经把 Python 做为计算机相关专业的入门语言了。 :-)
|
38
loryyang 2016-08-18 15:16:41 +08:00
科班考虑 C++,非科班,比如自学、培训班,建议用比较简单使用的语言
C++你需要花很多时间入门,而且开发效率很低下 |
39
lizon 2016-08-18 15:40:48 +08:00 2
新人是有多新,想达到什么目标?
科班出身:必须是 C 起手,然后根据选择的领域再换语言。 纠结性能型:必须是 C 起手,然后根据选择的领域再换语言。 语言研究型:必须是 C 起手,然后 Lisp ,然后自选。 数据处理型:首先要数学基础和建模基础, Python 起手,熟悉各种各样的库,有部分切换到 R 语言。 只当码农型:随便一个脚本语言就能用得很爽,但是职业生涯的上限也就这样,一辈子也就是把别人的想法翻译成代码。 为什么大部分必须是 C 起手?因为通过 C 语言是熟悉现代计算机系统结构的最佳语言,足够简单,抽象程度刚好,通过指针读写内存,修改 CPU 寄存器,对应图灵机的工作方式;深入 Linux 内核也必须是 C 语言。 |
40
fulvaz 2016-08-18 16:05:36 +08:00
我个人感觉当年本科的时候怎么没去自学 c++, 现在去补操作系统, linux 各种头大
虽然平时不用, 但是学完走得远啊 |
41
qfdk 2016-08-18 16:07:35 +08:00
反正一开始都是 C 起手,然后 Java python 之类的, C 必须要会,等你明白了 java C++就差不多了
|
42
exch4nge 2016-08-18 16:14:59 +08:00 1
如果以后有打算碰底层开发的话就强烈建议学,如果一辈子没这打算的话,就不建议学。不管新人老人,只要想做这方面的必定得过这个砍,过了这个砍,基本上其它语言也学起来简单很多。
底层包括但不限于嵌入式、内核驱动、破解溢出、游戏引擎、数据库引擎、性能要求高的其它类应用。 |
43
SlipStupig 2016-08-18 16:15:52 +08:00
学过 c 语言后,其它语言都没什么区别
|
44
ashchen 2016-08-18 16:15:59 +08:00
能走多远? 30-40 岁之间必须 转型。写程序只是一个阶段
|
45
FreeDog 2016-08-18 16:23:01 +08:00
@ashchen 稍微学一下,当成爱好也不错。无压力的时候写一些自己喜欢的小东西还是挺好玩的。毕竟语言是工具,不是目的,也不是负担。
|
46
bombless 2016-08-18 16:24:45 +08:00 4
我挺推荐 c++的,学习曲线平缓,用起来大概是这种感觉的:
“我已经学会了” --> “雾草这是什么” --> “我已经学会了” --> “雾草这是什么” --> “我已经学会了” --> “雾草这是什么” --> “我已经学会了” --> “雾草这是什么” --> “我已经学会了” --> “雾草这是什么” --> “我已经学会了” --> “雾草这是什么” --> “我已经学会了” --> “雾草这是什么” --> “我已经学会了” --> “雾草这是什么” --> “我已经学会了” --> “雾草这是什么” --> “我已经学会了” --> “雾草这是什么” --> “我已经学会了” --> “雾草这是什么” --> “我已经学会了” 你学什么都会有这种感觉,但是 c++特别容易给人以这种感觉。 如果你自视甚高,很可能是这样的: “我已经学会了” 蓝后就开心地活下去。 又能带来快乐又能带来冒险,我觉得非常非常棒。 |
47
mikej 2016-08-18 16:28:03 +08:00
c , c++和 java 选一样学把,这类强类型的语言里面有很多规范和标准是动态语言不具备的,不一定是为了找工作,学好其中一门语言,有了夯实的编程基础,想必再学其他语言应该就不在话下。
|
48
nicevar 2016-08-18 16:45:14 +08:00
因人而已,兴趣低、学习没有主动性、比较弱的不用推荐了
|
49
happywowwow 2016-08-18 16:54:06 +08:00 1
看过金庸的书, 感觉 C++ 就像是易筋经, 修的是内力
大家推荐的, 其实是去学独孤九剑, 因为实用而且见效快 不知道理解的对不对 |
50
inisun 2016-08-18 17:41:42 +08:00
@dtfm Java 编程思想这书,我是做到 J2EE 规范的程度才买来看看,有 Java 经验的人能跳着看,知道哪些不用看,跳着学,而毫无基础的,看到几十页来个移位运算符,瞬间就懵 b 的节奏。 C++ 就是回收机制、析构、 指针这类玩意,就已经筛选不少人,不用推荐的,让他们学个几天,感觉就会自行选择的了。
|
51
singer 2016-08-18 18:11:18 +08:00 via iPhone
被老师骗去说 C++工资高,然而学了之后,发现,工资应该会高,可是在拿高薪前,我头发还剩多少
|
52
hanxiV2EX 2016-08-18 18:29:03 +08:00 via iPhone
不会
|
53
tianshilei1992 2016-08-18 18:33:56 +08:00
我能说我巨喜欢 C++ 嘛…对这个超级感兴趣😂
|
54
chinuno 2016-08-18 18:40:38 +08:00 via Android
如果只想玩一下底层语言。那 c 语言要比 c++好太多了。现在 c++简直复杂到爆,什么都往里面塞,现在也没几个人可以说精通 c++的。而 c++用了这么久最常用的还是 c 那些东西。 c 不复杂看看就能会,学了 c 后真的想转 c++了也不会那么痛,因为 c++都可以当 c 写了。
|
55
veelog 2016-08-18 18:46:34 +08:00 via Android
c++然后熟悉几个开源库,就好咯。
|
56
phoneli 2016-08-18 19:01:25 +08:00
说实话。不推荐学 C++找工作。毕竟比较难找。
|
57
wangxn 2016-08-18 19:21:24 +08:00 via Android
我认为学 C 不是一个好选择。现在除了嵌入式,单纯用 C 的很少吧。是的,开源软件很多用 C ,但企业几乎没有。
|
58
gowk 2016-08-18 19:29:45 +08:00 via Android
我推荐 Go
|
59
erenno1 2016-08-18 19:54:40 +08:00 via iPhone
|
60
ivenvd 2016-08-18 21:30:14 +08:00 5
@happywowwow
C++ 像九阴真经,屌是屌,但是内容太 TM 多了,学完需要 20 年。 C 像神照经,用来入门不错,学了内功深厚,但是不知道怎么打人。 Java 像全真剑法,循序渐进,一堆人一起使还能摆出剑阵,虽然不一定打得过一个人。 Python 像小无相功,别人能干的它都能干,虽然你不知道原理是啥。 Ruby 像天山六阳掌,大家提起它时都说生死符超厉害。 PHP 像辟邪剑法,听说当年很屌,最厉害的武功。 Perl 像太玄经,[表情:黑人问号]。 |
61
kingoldlucky 2016-08-18 21:35:33 +08:00
一看到语言的帖子就感到无比蛋疼 闲得慌你们
|
62
happywowwow 2016-08-18 21:41:04 +08:00
|
63
seeker 2016-08-18 21:43:36 +08:00
c++ 的好处就是能让你了解底层原理啥的。
|
64
wizardforcel 2016-08-18 21:44:01 +08:00 1
我们大一必须学 C++,之后的项目就用得少了。到现在,有人投奔了 Golang ,有人投奔了 Rust ,还有人在等 Swift 和 C# native 上岸(手动笑 cry )。。。
C++这几年就是各种“从学会到重学”。有学习成本更低、开发效率和运行效率都很不错的语言,我干嘛不去学呢。 |
65
wizardforcel 2016-08-18 22:03:57 +08:00
你要是想找一种跑得快、开发效率高、静态类型、易学又贴近“底层”的语言,那就选 Golang 吧。
反正一样难找工作,不如选个好学点的。 绝对满足你的要求。闲的没事还能反编译着玩玩。 |
68
HarveyDent 2016-08-18 22:22:35 +08:00
如果有时间就整,别问那么多。如果没得那个时间就别折腾。
|
69
ivenvd 2016-08-18 22:43:23 +08:00
@happywowwow 不不 lisp 家族才是少林武功,毕竟天下武功出少林。 :D
|
71
ecloud 2016-08-18 22:51:19 +08:00 via iPhone
@lizon 科班难道不是先学 Pascal 么?现在的科班不学伪代码了么?难道是长得像 C 的伪代码???
|
73
wangxn 2016-08-18 23:10:24 +08:00
|
75
miaotaizi 2016-08-18 23:21:17 +08:00
喜欢就学, 我一边带娃一边再学呢.哈哈哈!
|
76
happywowwow 2016-08-18 23:40:54 +08:00
@ivenvd 欸? 不知 lisp, 但不应该是汇编吗?
|
77
kingoldlucky 2016-08-19 00:04:24 +08:00
@ecloud 呵呵 NMGB
|
78
lizon 2016-08-19 00:27:08 +08:00
@ecloud 伪码这个东西本身是辅助理解用的,谈不上专门去学习。从入门语言角度来看,不管是语法,实用性,对底层的控制能力,经验的复用性, C 都是完胜 Pascal 的。
|
79
FrankHB 2016-08-19 00:37:13 +08:00 2
@lizon 强烈反对 C 起手。即便迟早会用到 C ,也至少不该在没有其它高级语言经验的时候学 C ,效率太感人。
多数人根本就没有资源(比如说,不会轻易上当的天赋)起手的起来,不花足时间结果就是 C 和体系结构都半吊子,还特么特别容易自我感觉良好( C++这里倒是相反)。某些科班出身眼高手低的和理论水平极端差的, C 的锅跑不掉。下面 @bombless 说的就是这回事。 而且真正适合 C 开发的领域远比 C++要少。具体和 @wangxn 说的差不多,除了现在开源软件这点。现在新的开源软件也并不那么愿意用 C ,还有一些重要的开源软件从 C 转到了 C++(比如 GCC )。 纠结性能如果是指保持同等性能预期下如何偷懒,那么基本不该去在乎是不是用 C ,因为不比 C 实现代码生成代码而抽象远比 C 靠得住的语言现在有很多,用 C 明显事倍功半。除此之外,不会找热点的,基本没什么立场去纠结性能。 而搞语言研究从 C 开始就是没事找事,非得先学反面教材自残?搞清楚现在不是那个 Lisp 后端得靠 C 糊弄的时代,对研究语言实现 C 都没必要。 如果非要给个替代,先拿 SICP 前几章垫着再学 C 在上面每一个目的上学习效率都能吊打直接拿 C 起手的。 @ashchen 错觉。 @happywowwow 不太准确, C 艹是内外兼修的。 只是外家功夫用的溜的不多,所以很多人有错觉。比如开发效率问题,如果姿势正确,实际上坑的取决于问题本身和别人的代码怎么写,而不是你的水平。 C 倒是一边倒偏内功。 @ecloud 现在科班基本上就没伪代码这回事了。 Pascal 除了 OI 到处用不上。 C 本来就是典型的强类型语言,因为规定了表达式具有的类型以及 effective type 。 注意 typing 不是 type checking 。所有允许名义类型检查存在的语言规则原则上都确定了“强类型”。只不过后人糊了所谓的弱类型瞎比较以及让强类型和××安全混为一谈所以扯不清了。 另外就算当成类型检查,强制(coercion)在强类型检查的意义下也是一种多态(ad-hoc polymorphism),不是类型检查的例外规则,不是弱类型检查的依据。 (英文喂鸡这里连续有好几个错误。) |
80
ivenvd 2016-08-19 00:52:51 +08:00
@happywowwow 汇编大概是武当长拳之类的,学的人多,能像乔峰一样用来打人的少……
|
81
FrankHB 2016-08-19 01:27:59 +08:00
……很遗憾,随便逛了圈,发现 C 学傻的大概的确到处都是。
这里后面回复的大半楼几乎全能挂上: http://www.v2ex.com/t/298012 连 C 的 object 都不知道是什么还好意思装作会……再次表明 C 坑比 C++坑更危险。 |
83
lizon 2016-08-19 01:41:57 +08:00 1
@FrankHB 在不清楚这个初学者以后到底要干什么的情况下, C 是性价比最高的语言。
用高级语言起手,会给初学者造成一种假象:底层那些复杂的弯弯绕已经被封装完美了,我们只要学会高级语言足够应付。 由俭入奢易,由奢入俭难。 殊不知高级语言那些名词会让初学者进入一个迷宫,继承,虚继承,虚表,函数指针,接口,值传递,引用传递,回调,委托,局部静态变量,协程,闭包。这些来自不同语言的概念,到底哪些本质上是一样的,或者说这种表现出来的特性,落实到 CPU 和内存上到底是怎么实现的? 作为工程派: 多线程竞争, volatile 关键字到底在影响什么, CPU cache 工作原理,以及一些以后可能会遇到的诡异 BUG ,甚至需要反汇编去搞清楚问题。如果只是疲于应付高级语言的概念,不了解底层实现,不能体会到程序编写其实就是”直接在一张白纸上写字“的感觉,那他对程序的理解也就止步于某一门语言中。 C 就是笔,最自由的一支笔,内存就是白纸,写什么,写上去的东西怎么理解,发生怎样的状态变化,产生什么行为,在 C 语言中是最直白清明的。当意识到面向对象与结构体还有函数指针关系的时候,才不会滥用设计模式。 作为学院派: 就算图灵机与λ演算是等价的,分别作为二者典型代表的 C 和 Lisp ,也明显是 C 的程序更符合初学者的思维方式,学完了这两门,其他语言都是在这两种语言之间做取舍。没有什么反面教材,一切的设计都是对解决问题的权衡,确实是有考虑不足的地方,但是不要局部不完美泛滥成整体否定。 |
84
Tyanboot 2016-08-19 01:53:52 +08:00
扯点我自己的事情。本人今年高三毕业,报了计科。
如果要说我第一个学的是什么,就是 C++了,当时存粹是看了一眼姨妈贴上靠前的语言,然后从高一开始买了本书然后自学,当时只有微弱的 VB 基础,硬着头皮看了书,自己实践了实践,可以说是入门了,之后也是慢慢的看看资料,不懂的去请教大佬。 高二的时候又自学了 PHP ,因为有 C++的基础,感觉学起来特别快,一两个小时就搞懂了基本语法什么的,然后写了个小网站(表白墙)丢出去了。 前不久毕业了又学了点 C#,帮人做了个抓评论存 Excel 的工具。 而且都是因为有基础,理解其他的语言都挺快的,但是实际上感觉现在 C++已经基本不怎么接触了,除了在用到 Win32 的一堆 API 的时候,做 UI 的程序还是 C#来的快。 前不久还有几个同学来问我他也报了计科和软件工程,问我入门学点什么,我都没敢给推荐 C/C++,都只推荐了 python 或者 ruby 之类的,然后可以去学学 Java 。 就我个人感觉而言, C++学习起来慢,正如好多人说的,到处都是学了很久 C++然后只会写黑框框的人,,,对于那些完全没基础的我是不会随便就推荐 C++这种的。如果是有基础的那种,我可能就会考虑一下让他了解了解 C++的。 |
85
FrankHB 2016-08-19 02:12:53 +08:00
@lizon 你的回复有一些比较明显的问题。
1.讲性价比而不顾风险。学茬、低效、一事无成很容易导致性价比一点都发挥不出来。 2.我上面说过不管基本上为了哪种目的学 C ,都有比直接学 C 更有效的策略。 3.你似乎不把 C 当“高级语言”。然而不管 C 的抽象有多不给力,事实上 C 就是彻头彻尾的高级语言。 如果说 C 因为能操作底层实现所以显得低级, C++和 Rust 之流同样也做得到。这和抽象能力的上限没什么关系。 而纯粹的 C ( strictly-conforming ISO C )甚至严格地比 C++更“高级”。比如说, ISO C++引用的 POSIX 的 errno 错误码在 ISO C 里缩水得没剩几个。 可见仅仅要让 C “底层”到堪用到这点程度,就必须学更多 C 以外的东西。更别提二进制互操作了。 注意,你所谓的“俭”——表达相同层次的抽象时对实现细节依赖少——在日常见到的语言中,恰恰就最符合的就是纯粹的 C 。要说其它的,基本上是个日用的语言都不会那么“俭”,而会偷懒假设更多东西。 (当然, C 也不是都不偷懒,比如和 C++一样假定一个字节至少有 8 位,但不管怎么说比 Java 和 POSIX 这样钦定一个字节=8 位总是明显“俭”的。) C 正是用这点换来了卓越的源码层次的可移植性(尽管实际上由于限制过于严格多数场合并没有什么卵用……)。 所以你说的学 C 只能认为是学 C 和底层的其它知识,这并不比学其它语言+底层知识优越,还更容易引起混乱,同时得到的技能并不实用。 4.混淆抽象性质和实现的层次。 具体来讲,“高级”和“高层”不是一回事,“低级”和“底层”也不是一回事。(有多少人知道有高级汇编语言……?) 底层实现和强调抽象完全不矛盾;相反,为了了解底层实现,一些(和高级语言类似的)抽象是必要的,否则一些情况会导致理解底层这个任务都不具有可行性。 提一下, volatile 本身恰恰就是非常学术的东西,而且算是 designed by committee ( X3J16 )而有正面反馈的典型例子。 工程上实践对 volatile 的大大咧咧反而导致了一大票的误用 bug 的笑话。 比如语言设计领域算是比较著名的 double-checked locking 失败例,最终迫使 Java 更改了 memory model ,而现在 Java 和 C#的 volatile 的意思和 C/C++里的截然不同。 直接根源就是多数用户对 volatile 的想当然。 有多少工程派领会到了这些背景知识?有哪些纯粹的工程需求驱动你去了解这些东西? 我不怎么相信你没有足够的抽象会支持你看得下去,因为具体的东西太细碎了。 另外,像 cache coheretece/memory consistency 这样的东西,我也不信你用反抽象的方式能理解得了。 如果说抽象迟早绕不过去,为什么还要用低效的方法? 5.如果要学院派,请严谨地保持含义的准确。 图灵机与λ演算显然不等价,因为“等价”不等价于“可计算性等价”。 对选择学什么语言入门来讲,恰恰需要在乎其中不等价的部分,比如说抽象能力和性能。 6.注意蕴含逻辑。 即便“ C 的程序更符合初学者的思维方式”,也不自然表示这是初学者需要的思维方式。 何况“ C 的程序更符合初学者的思维方式”其实是很有疑问的。 初学者(乃至有几门其它语言经验的老手)基本上不可能理解 C 的抽象机模型和可观察行为等价的要求,所以没几下子就只能拘泥具体实现了,同时还没搞清楚适用范围。 结果就是一些很重要的基础知识(比如什么是 UB )都缺乏机会掌握,上手做什么就被坑什么,坑了还未必能总结出规律下次避开。 这样还不如直接就来抽象能力强一点的语言呢……好歹能上手把更多的事做对,而不至于找不到方向。 |
86
FrankHB 2016-08-19 02:40:27 +08:00
@lizon 关于反面教材我倒是可以再解释一下。
对于搞语言实现的来讲, C 勉强顶用(但现在也不必要),但对 PLT ,以 C 作为目标是坏榜样。 理由和可计算性没什么关系,而是抽象设计的局促,不仅比起更现代的语言没有优势,功能和设计的一致性上就显著地比同时代的 Lisp 方言劣等。(为什么没有一等函数?) 即便是学习过程中 C 充其量也就是个中间产品,这样还不如直接用 C--或者 LLVM IR 什么的免得什么 decay 之类乱七八糟不务正业扰乱视线。 此外, C 的很多经典的设计,以现在的观点来看,是迁就实现的落后而带有误导性质的设计。这对于几乎所有用户都会产生效果。 比如指针,说穿了就是一堆能共用实现但抽象上本不需要相关的 sum type 。然而先学 C 学岔了不去补习其它语言设计策略或者理论的,基本上就没机会去自己发现 sum type 了,却实实在在“享受”这些设计带来的易错和其它工程上明显低效性质而浑然不自知甚至自以为优越。 (类似指针的东西当然是有用的,但不需要也最好避免在 C 这个层次上提供。) 再如数组的[],一定意义上导致用户对真实的实现上对应的操作具有错误的复杂度假设——尽管严格来说这不算 C 的问题( C 也确实没保证)。 |
87
muziki 2016-08-19 03:04:45 +08:00 via iPhone
@FrankHB 终于把您 V 站上所有的回复看完了……对计算机的理解简直可怕,能斗胆问下您怎么发现研究这些像我这种“半瓶醋”面对某种语言出现的理解错误?(例如你回复里面提到的 C 语言抽象性某种程度上高于 Cpp ,动态静态问题之类的)
|
88
SeanLin 2016-08-19 08:27:39 +08:00
如果你足够新手的话,建议先从你想做的产品来反推改点的技能树。
btw C 上手很好 C++上手很不好 |
89
taozhijiangscu 2016-08-19 08:39:47 +08:00
C 作为入门语言是十分经典的,不然也不会这么多年傻乎乎作为计算机科班和非科班的入门语言了。而且 C 其实很简单也很直白,不像 C++具有很多潜规则。此外现在 C++标准越来越臃肿了,不知道是不是标准协会在刷存在感。
入门之后,基本就是 C++、 Java 分流了,两个语言极其相似,但除了性能、可移植性等因素外,最大的差异就是内存回收的机制了, Java 简单,开发效率高,也不容易写出有大问题的代码,虽然 Java 很不低碳环保。 当然我是说的服务端的开发,其它不了解就不评了。 |
90
jeffersonpig 2016-08-19 08:42:51 +08:00
用了 5 年 C++,表示不会,但是会推荐 C 。 C 认真学习锻炼之后根据自己兴趣和工作需要再去选择其它语言。
|
91
jefferyfan 2016-08-19 08:44:29 +08:00 via iPhone
编程语言的思想是相通的,学完 C/C++之后,其他大部分语言都很快可以上手。 但是上手之后,语言的特性还是需要去学习。
|
92
FrankHB 2016-08-19 08:50:03 +08:00
@muziki 自己了解,不要人云亦云。
比如说…… @taozhijiangscu ←反面教材。 是不是简单直白就不说了,自己比较 spec 去。 只是需要多澄清一点: C 的潜规则一点都不比对应的 C++少,而且往往更膈应人。 int i; int; int main(void){}呵呵…… 至于为啥多数人都没法注意嘛……写书卖钱教你的会拿自己都没把握搞清楚的东西来恶心你劝退? |
93
FrankHB 2016-08-19 08:52:50 +08:00
噫……又抽……
int i; int i; int main(void){} 关键字 tentative definition 。 很讽刺的是只看 ISO C 基本是看不懂为什么需要这玩意儿的。倒是 ISO C++的 Annex C 里讲不兼容 C 的部分时会说清楚理由。 |
95
21grams 2016-08-19 08:57:23 +08:00 via Android
c++一样可以做 web ,也有 web framework
|
96
ecloud 2016-08-19 09:02:55 +08:00
@taozhijiangscu C++和 Java 最大的区别是, Java 有一个官方,基本库固定,各种方法特性都很清楚明确。而 C++是多头主义,一家一个风格,一个做了 5 年 MFC 的人去搞 Qt ,会发现“这都是什么鬼?”
|
97
ykk 2016-08-19 09:09:48 +08:00
还是根据需求来 以后想做什么 本科基础大多是开 C 吧 开 C++是基于什么考虑?
|
98
kingddc314 2016-08-19 09:20:56 +08:00 via Android
搞 C++的,但是我推荐 Go
|
99
ecloud 2016-08-19 09:22:40 +08:00 1
@FrankHB 很多东西由于历史久远的误解,以讹传讹,黑的被说成了白的。关于历史问题我曾经在别处说过多次,大概 V2 这里人的年龄都比较小,所以不甚了解。
最初 K&R 他们发明 C 语言的时候就是想要一个“更好用的汇编”,所以他们的 C 编译器写的非常宽松和随意,目的就是为了尽量体现低级语言的特征,然而从 C 本身的语法构成来说,其实就是简化版的 Pascal 。由于 K&R 他们对编译器开了那么一个头,造成了后来的 C 编译器跟着学样,比如早期的 gcc 。所以 C 的所谓“低级语言特性”其实是背了编译器的黑锅。 常年玩 C 的人会发现一个状况,就是你的程序在两台不同的机器上编译的话,有可能会产生不同的结果,而这不同的结果几乎都是由于代码里某个深层次的 Bug 引起的(一般都是内存分配和数组越界问题)。但是如果你一直在一台固定的机器上编译的话,这个 Bug 可能一辈子都不会被发现。然而像 TurboC 这种非 K&R 模式的编译器则完全不会出现这种情况,一段代码在无论哪台的 TC 上编译都是同一个结果,因为 TC 默认使用一个沙盒来编译。 再说说 Pascal 的问题。在 K&R 风格的 C 编译器开始流行的年代, Pascal 的流行用法是先预编译成 p 代码,然后在 UCSD-p 系统上运行的。这跟后来的 Java 很像,换句话说,就是在虚拟机上运行。所以,一个靠虚拟机运行的语言,怎么可能控制底层和内存这些东东呢? Pascal 也背了编译器的黑锅,给人一种不具有底层控制能力的错觉。然而实际上,世界上大部分的飞机导弹的控制程序是 Ada 写的, Ada 不就是穿了件马甲的 Pascal 么! 最后关于 C 的强弱类型问题,是个持续了几十年的论战了。反正在我的概念中, if (a=5) 这种不光能编译通过还能发挥有效的实际作用的语言,都谈不上强类型 |