Blog

C C++ Java

KandR我曾经幼稚的以为C++语言是计算机编程的终极武器,因此在当年没有互联网、信息闭塞的年代,当我还在用BASIC语言的时候,我就一直梦想着的一用上、学会C++,也一直在幻想着,用C++编程会是什么样子?那时候,我对C++仅有的知识,可能就是从一些计算机普及书籍的前言部分,还有《开天辟地》、《万事无忧》等光盘中得到的吧。记得上面说C语言当代码长度超过5000行的时候就显得无力,而C++则解决了这个问题。我不知道为什么C++会没有这个问题,只是相信C++是一门更强力的语言。

有一天,机会来了。在周末的课外英语辅导班下课后,来接我的父亲给了我一份意外的礼物──在辅导班教室不远处的盗版光盘店买来的Visual Studio 6.0企业版的安装盘,一共有六张光盘,当时拿在手里也有种“沉甸甸”的感觉。其实我到今天也不明白,不懂编程的父亲怎么会挑中这么一套光盘,而我之前一点也没提起过。不过当时的兴奋已经让我无法思考这些问题了,因为我赫然在封皮背面的介绍中看到了Visual C++企业版的字样,瞬时间其它的Visual Basic 6.0、Visual J++、Visual FoxPro什么的我都看不到了,尽管后来FoxPro可能是我用的最好的(基于原先从少年宫学到的FoxBASE的基础)。

回家后第一件事就是把它装上。到现在我已经很多年没有接触过Visual Studio了,因此也早已忘记了当年那将近一小时的等待。反正经过了漫长的等待之后,我终于见到了它的庐山真面目。不过对C/C++没有丝毫概念的我自然是不会用,于是就一直物色一本相关教材了。

济南三联家电的五层(要么就是六层)上有一小块区域在卖计算机教材,记得大约有两、三个书架的样子。而我从里面竟然找到了大约有三厘米厚的《Visual C++ 5.0编程大全》,售价好像是66元。经过父母的同意后,我欢天喜地的把书捧回了家,这也是我买的第一本自己都觉得贵的书。不过相对与后来的动辄八、九十甚至一百多的计算机书,真是感觉不胜唏嘘啊。另外,后来同样是在这个地方,我也买到了另外一本对我影响很大的计算机书──谭浩强的QBasic相关的书。

回家后我就迫不及待的想把书上的例子输入进去运行试验一下。因为当时似乎英文还没怎么开窍,输入的自然很慢。我又闲书太厚,一遍压着书页一遍敲键盘不方便,还让坐在我身后的母亲帮我念着我来输,不过也是很不方便。最后终于成功后,看着在IDE下半部分输出的一串字符,似乎有种怅然若失的感觉。略微有些失望──这就是传说中的C++?

我买的那本书是很早期的C++书籍,并不像现在的C++书上来就说建议读者把脑中的C完全忘掉,把C++当成一门全新的语言来学。而那书上来的例子都是成对的,一个用C写的例子,接一个用C++写的例子。我当时固执的认为C++是比C更好的语言,而且那书上明确的写着“C++是C的超集”,我虽然那时还没学过离散数学,不知道“超集”的明确概念,但也知道是更好更大的意思。于是我看到C的例子(区分方法就是文件名以.c后缀的)就跳过去,只看C++写的例子。而且当中看到第二个C例子时,其中的一句printf()还有一堆百分号之类的东西,让我百思不得其解,甚至以为是印刷错误,于是更打消了看C例子的念头──由cout<<组成的句子看上去多直观啊?

当时越看越迷糊,但也能囫囵吞枣、隐约有些懂但又不明所以的看了下去,后来看到似乎是第八章,名叫《数组》,还有第九章,名叫《指针》。当时觉得数组挺简单,因为BASIC中也有点基础,而指针,我很早就听说了是造就C/C++语言强力的关键,因此就聚精会神的看指针。我倒是看懂了int *p = &q;之类的语句,也大概明白了其中一幅幅的示意图,但看完了全章,到底讲了什么道理,完全没有概念。我那时贯彻的精神是看不懂的就看个差不多,然后就跳过去。

然后有一天,我惊讶的发现竟然跳过了书的第一部分,而第二部分的开篇就用煽动性、似乎相当惊喜的语气告诉我们,要接触一个全新的、美妙的部分了──面向对象。这是大概十多章之后的内容。然后就是类的概念,我发现我似乎又能看懂一些了,然后就继续往下看,中间讲了什么也全忘了。然后后面就带过了Windows API编程,有几章讲了MFC编程什么的。然后全书完,我则没有些许概念。或许可以用C/C++写点给半径算圆的面积周长之类的小程序,反正就是用C的语法写BASIC程序。

直到多年以后,我买来了谭浩强的经典的《C语言程序设计》来看,才终于搞懂了printf()函数中引号中那一堆百分号的意思,也稍微了解了一下指针的作用。才发现一切与我想象的是那么的遥远。

中间有一阵子我一直想学会C语言,但那一阵子我的主修语言是Pascal。后来上了大学后才逐渐开始用起了C。本来我觉得自己有一些基础的,用C写作业基本上是小儿科。可一次又一次的bus error让我十分受伤。而且我发现我连最普通的字符串的概念都不清晰,什么时候用数组形式,什么时候用指针形式,这点都还搞错。写东西的时候凭感觉觉得是完全按照要求写的,可运行起来完全不是那么回事。这让我有一阵子特别不愿用C语言来写东西。

duke同时我在学校学一、二年级的课的时候,很多时候都是用Java来写作业的。开始的时候我特别不想用Java,觉得它太罗唆。在C中只要几行的打开文件,在Java中非要放入try中才能编译。不过随着经验的增多,以及C给我的一次次的打击,我渐渐的感受到了Java的好处来。尤其是垃圾回收机制,让我免于bus error的困扰。随着软件工程课程的进行,我逐渐学了Unit Test,并应用在了项目作业中,才感受到了TDD的好处。

两个星期前的计算机网络的实验,让我们用C语言写SOCKET程序。服务器端从文件中读入公交车的到站时间,客户端给出目前时间和公交车的号码,服务器端返回下一趟车的到站时间,要TCP和UDP的两个版本。我本来心中有些惴惴,后来一写下来竟然非常顺利。把读入文件、和查询时间写在单独的模块中,让TCP和UDP版本的都能调用,避免了冗余。这样下来让我信心大增。

后来又开始写计算机组织的第一次作业:用C或C++写一个简单的虚拟机,老师给出了硬件的设计和编译器,我们的虚拟机解析二进制字节码并执行。当时写下来觉得没有什么语言上面的问题。但今天看到了老师给的标准答案,还是让我很汗颜,让我觉得自己的水平实在够烂的。中间我还穿插着用C语言解决一些密码学作业上的问题,感觉C语言用的更加顺手了。

总结我之前的不足,我汗颜的认识到实在是基本功不扎实的原因。原先我不知道怎么用fgets()来读一行字符,而总是用gets()而不顾编译器的警告。后来也是通过操作系统的作业和实验才习惯用fgets的。而字符串之类的问题则更是如此了。

之前我曾经分析过我学习编程语言的过程,发现真正让我有所提高的是学习完语法后的练手的过程。我学BASIC的时候,虽然感觉进步最大的是有一天下午在姥姥家躺在床上几乎看完了一本从书橱里翻出来的谭浩强写的一本很古老的计算机教材的后半的讲BASIC的部分(前半部分介绍的主流计算机是国产的DJS,你就知道有多老了),那本书是我二姨的大学教材,看完后我了解了大多数BASIC语法。但真正让我把BASIC语言运用的烂熟于心的是我后来用BASIC写的一系列程序(求闰年之类的)。我的Pascal语言的语法阶段的提升是在升高中那年暑假在山师上奥赛班时看的一本《计算机奥林匹克(提高版)》,但真正让我熟练运用Pascal的是后来做的一系列奥赛题目。其它语言,比如Perl和Python都是如此,Ruby语言还没有经历这一步,因此现在也不算很熟。而我中间曾想用这种方法提高自己的C语言功力,试图在USACO注册一个新帐号,从头做起,通过做题来练C语言。结果后来因为时间问题而没有坚持下来。

现在的几次作业让我又一次有了这种感觉,我希望能在近期突破这一层吧。

1 comment

  1. 编程语言喜好 | 我的空想特摄 - pingback on 2012/05/04/ 16:04
    沙发

Leave a Reply