今天我们聊聊C/C++语言的五个层次。 这已经是C语言系列文章的第四个了,前面的三个文章分别为:
为什么C语言不会过时?
什么教材适合零基础的C语言学习者?
为什么C语言很难?
首先是第一个层次。在这个层次你知道基本的语法,能写个hello world,给女朋友打印个心形,读写个文件啥的。要是经历过正统的本科计算机教育,还可以构造个链表,整个vector和map 往里赛个整数,字符串啥的!总之,大部分人这个时候基本上就以为C/C++语言也就这样了,没啥可学了呢。在自己的简历中,非常自信地写上了“精通C/C++语言”。
然后,你开始参加工作了,开始做一个实际点的C++项目。这种项目无论大小,只要是实际上还有点用处的,你一定是踩过if(a=1)这种坑,一定吃过3/4等于0这种亏。你也一定经历过程序昨天还好好的,在老板面前demo的时候就 segmentation fault了。同时,你开始有了疑问,啥时候需要用static,啥时候需要用const。什么时候使用模版的特化和偏特化 ?什么时候使用函数指针?声明和定义的区别?编译单元又是什么东西?你有点对自己的C++语言水平不自信了。你开始对数组和指针小心翼翼了。你突然发现stack overflow原来是这么有用的一个网站。 恭喜你,你现在开始进入第二个层次了。
经过如干时间,你终于搞清楚了上面这些问题的答案。现在你也基本可以编写一个实际的 C++ 的小型项目了。这个时候你最大的困扰是为啥你的C++语言总是用的像C语言一样。现在你的年龄也有点大了,你妈妈不时催促你找个对象,你也开始认真思考什么是面向对象。 假设你现在有这样一个场景:一个人,一颗心,一个牙刷,这个人的媳妇,老妈和朋友,你如何设计一个类了?如果你写出这样的类定义,恭喜你,你开始进入到第三个层次了。这个时候你开始充分利用面向对象的语言来熟练的描述现实中的各种关系了。同时以前你怎么都读不懂《设计模式》现在能读出点滋味了。
class Person{
Heart heart;
Unique_prt<Brush> brush;
Person* wife;
Person& mother;
LendMonday(Person* friend); //this is a function
}
好了,我们再接再厉。在第四层中,你开始实现一个编译器了。你开始了解g++中各种优化开关背后的含义,你开始查看编译器产生的Intermediate represent语言, 这个时候,以前困惑你的char+int为什么要把char先变成int这个问题,终于不再困惑你了。你开始明白为什么需要this指针了。你知道了大头和小头。你进入第四层了。 这里需要澄清一下,这个层次并不是说自己了解编译器,而是自己参与实现编译器。目前C++主流的编译器就三个,g++, Clang, VC++。 如果你再对编译器的要求苛刻点,可以把VC++去掉。那么问题是,你是这些编译器的核心开发人员吗?如果不是,对不起,你还没有进入第四层呢。
都开始玩编译器了,才进入第四层,那第五层到底是个啥?第五层是制定C++语言的标准了。这个层次大约有100多个人。不定期开个会制定新的C++标准。这里是一张会议照片。
我强烈怀疑这些人能不能写出来一个没错任何错误的hello world。因为你从标准里根本读不到“CPU”,“内存”,“简单”,“喜欢”这些词。只有什么“右值引用”,“浅拷贝”,“模版元”,“类型推导”这类的词语。我曾经误打误闯地搞了一年多的编译器,所以必须硬着头皮,读过几页的C++标准,我可以用我的性别担保,它们真的很难读,不服来战下面这段:
Unless otherwise indicated (8.2.2), a prvalue shall always have complete type or the void type. A glvalue shall not have type cv void. [ Note: A glvalue may have complete or incomplete non-void type. Class and array prvalues can have cv-qualified types; other prvalues always have cv-unqualified types. See Clause 8. — end note ]
总结一下:整个的过程是这样,标准对编译器说,你听我的。编译器对C++语言说,你听我的。C++对实际问题说,你听我的。实际问题对程序员说,你听我的。作为程序员,你有两个选择。你可以说,我都精通C++语言了,我谁也不听。那你就可能一辈子停留在精通这个阶段。如果你选择,我听!那么好,你仔细听,你会慢慢地开始听见C++语言怎么说,编译器怎么说,标准怎么说。
真的别再说自己精通C++语言了,上面照片里那一百多人都不敢说他们精通C++语言,这是因为他们知道C++有多大,有多复杂!写完这篇文章,我信心满满地说:我了解C++语言,并且掌握一些。你呢?