1、 C语言已死吗?
本资料描述的是使用C语言的高级技巧,力求将你的C语言能力由“基础”提升为“高级”。但是学习态度胜过学习方法,在正式学习之前,有一个问题不吐不快,那就是“C语言还值得学习吗?”
正方观点——C语言已死
正方论据:C语言的三宗罪:
1、代码底层,缺乏共享。
与Java多如牛毛的库函数、三方控件和框架相比,C语言的库函数简直就是少的可怜。如果说Java是个富得流油的大财主,那么C语言只是一个家徒四壁的小佃户。选择C语言,开发者必须独立设计所有的细节,小到栈与队列,大到串口与通信,必须从底层开始设计全部的代码。
比如字符串分解,在Java中仅仅调用类的一个方法就可以完成,但在C语言中却无从调用。又比如说数据结构,Java中所有基本数据结构都提供了现成的类,但在C语言中,开发者必须自己设计诸如队列与树之类的内容。再比如说网络通信,Java中重载一个类既可以获取用户在网页中提交的内容,但在C语言中,这简直就是不可以想象的事情。
有人说,Java只需2万行完成的代码,在C语言中需要7万行,这无不道理。
2、指针犀利,访问灵活。
C语言特别灵活,可以访问绝大多数的系统资源,尤其是C语言的指针,简直就是一把锋利的倚天宝剑。当程序正确时,C语言能够加速运行,减少代码。但是,谁能保证程序没有bug呢?倘若代码中出现了错误,哪怕是一丁丁的错误,也能如蝴蝶效应般产生不可估量的后果,所谓“一个语句可以造成程序全面崩溃”就是这个道理。
3、应用狭窄,界面简陋。
几个IT人讨论技术,十有八九发现他们使用的都是Java。几个学生展示课程设计,Java同学总是展示某某管理系统,引起同学们的阵阵惊呼;而C语言同学总是展示一个黑洞洞的窗口,只带来一些友情似的稀稀落落的掌声。仿佛C语言在编程队列中被边缘化,似乎C语言项目正在一步一步的走向末路,好像C语言程序员正逐渐消失。
正方结论:C语言属于英雄,他注定是英雄的长剑而不是平民的武器,所以,一般的大学生无须选择和学习C语言。
其实并非如此,正如流言在真相面前不攻自破一般,打消大家怀疑C语言的念头,其实很简单,两个数据就可以使这种怀疑消失的无影无踪:
其一、《编程语言排行榜》
翻开排行版,无论哪个月份,前三强必定是Java、C和C++,C语言的比重绝对超过15%,Java也只是在20%左右,所以学习C语言,绝非无用武之地。
其二、招聘网站
进来各大招聘网站,搜索C语言及其相关岗位,绝对可以得到大量的信息,这也从正面证实了学习C语言,前途是光明的。
由此看来,C语言不但未死,相反还活的有滋有味。既然学习C语言前景广阔,那么为什么很多学生迷茫,很多学生谈C色变呢?这是因为,学习C语言,前途是光明的,道路——其实并不曲折,但却是掩盖的,明明路就在前面,但是同学们就是发现不了,只好在黑夜中挣扎,把大部分学习的精力浪费在无休止的挣扎之中,久而久之,增加了C语言的恐怖气氛,自然而然地缺乏了学习C语言的兴趣。
2 、这样学习C语言最有效
学好C语言的秘诀就是1234:“一字真言,两种态度,三个框架,四项注意”。
一、一字真言
各位看官,学好C语言,其实只需一个字,那就是“编”。
(一)编。
学习C语言,乃至学习所有的语言,都讲究一个动手——不是动手打人,而是动手编程序。你必须通过编写程序来熟悉知识、理解知识。倘若只学不编,只看别人的程序,自己不动手写,是不能从入门到精通的。要知道,在计算机界,只说不练的人很欠揍。试想一下,你在哪里辛辛苦苦的编程序,他却站在一边,如老板一样喋喋不休,对你提出这项意见,那项思路,甚至畅谈自己编程将会如何如何,好像很牛皮的样子,但就是不编一行代码。估计大家碰上如此之人,只会一个动作,那就是点击“踩”。
一个“编”字就可以学好C语言吗?真的如此简单吗?不是的,仅仅“编”是不够的,你还需要“我编”。
(二)我编。
请注意修辞,“我”编!这个“我”其实就是只“你”,也就是学习C语言的人。
大家在学习C语言时,要多编写程序,比如学习链表时,要自己编写链表程序,甚至自己编写俄罗斯方块等游戏程序来练习。不过有个前提条件,你必须自己编写这些所有的程序才有效果,如果你从网络上下载了某某源代码,或者拷贝了同学的程序,任何大言不惭的说是自己编写的,那么我也只能大言不惭的告诉你,这样做出了养成偷窃的习惯外,没有任何效果!
有同学会问,那么“亲自”编程序总可以精通C语言了吧,其实还差一点点,仅仅“编”是不够的,只是“我编”还不足以精通,为了达到C语言的最高峰,你还需要“我编编编”。
(三)我编编编。
“编”字重复三次,这里的“三”,代表多,意思是你必须多多的编写程序。亲自编写10行代码等于没有编,亲自编写1000行代码是远远不够的,亲自编写1万行代码还马马虎虎,亲自编写10万行代码,你绝对成为程序员中的战斗员。
乍一看10万行代码,估计有同学会先直挺挺的躺下去,然后又眼珠一转站了起来——他们想起了坏主意。“不就是10万行吗,容易!现在的编程工具都有代码生成功能,随便在VC中用鼠标拖曳几下,搞一个MFC窗口程序,系统就自动生成了几百行的代码。在搞几个三方控件,几千行代码就生成了!”
再次声明,“编编编”是有前缀的,那就是“我”,也就是学习者自己,使用代码自动生成工具产生的代码难道是“学习者”编写的?
要不上有政策,下有对策,“不用代码生成器,那么就抄,照着输入代码就行!”哎,人不能无耻到那种地步!这十万行代码要“你”亲自完成,亲自在脑海中发芽、生根,再亲自逐行输入。这又不是什么政绩任务,也不是什么形象工程,欺骗别人最终只能是自欺欺人。
二、两种态度
一般人提起C语言,常常一个字如影随形涌上心头,那就是“难”!害怕啊,C语言真是太恐怖了,传说中的指针真是太锋利了,一不留神就把系统划破,搞出几个死机重启都是太正常不过了。
其实没有必要这么担心,本朝太祖曾经说过:“在战略上藐视敌人,在战术上重视敌人。”
(一)战略上藐视C语言
其实,C语言也就是一个普通的语言而已,别把它想象的太难!与Java相比,C语言也只是程序复杂一点、代码冗长一点、库函数少上一点、三方控件难学一点,编译工具简陋一点、指针麻烦一点,其他的都差不了多少,程序设计思想总是一样、程序构建总是相同的、程序语法总是类似的、程序逻辑总是差不多的。
没有必要对C语言谈虎色变,把他当成一门普通的语言就行了。要知道,就算C语言再难,总比汇编语言容易掌握、比机器语言容易记忆、比英语容易掌握。所以要自信!一切C语言都是纸老虎。
(二)战术上重视C语言
虽然我们在C语言面前保持了激昂的斗志,虽然我们无所畏惧。但是真正在学习得过程中,还是务必保持谦虚谨慎的态度,戒骄戒躁,不要因为搞了一两个俄罗斯方块游戏程序就洋洋自得,以为老子天下第一,甚至只遍了10行代码,就到博客中到处骂人,到处“踩”人的帖子。要知道,“雄关漫道真如铁,而今迈步从头越”,无论你学了多少,只要还没有走上工作岗位,那么万里长征就只是才迈出了第一步,还有很长的道路等待着你。
三、三个框架
学习C语言,“编”不是问题,问题是“编什么”、“怎么编”、“编多深”,下面就来解决这些问题。
(一)静心不静
1、静心。
学习的过程,是一个漫长而枯燥的过程,学习者必须要有吃苦耐劳的准备,静下心来,从大家的视觉中消失,经受一个长时间的编程学生过程。吃尽苦中苦,方成人上人!等你重新回到大家的视野时,你会有一个蜕变,那时一切的痛苦都将化为甘甜。
温瑞安先生有一部武侠小说,叫做《请借夫人一用》,我们这里也借用一下。当然不是借用别人的女朋友,而是了解一下主人翁的学习历程。主人翁韦青青青出场时浑然是一个高手,他把一千零一招的功夫柔和在一招之中,但是在其出场之前,江湖上没有人知道韦青青青这一号人物,因为他正在十年如一日的专心练功,正是这种练功时的不为人知,才造就了了日后的温瑞安小说高手。
不谈武侠,来个IT版的例子。在遥远的大洋彼岸,在微软的IE横行之前,在互联网刚刚起步之时,有一个叫做“网景”的浏览器占据了市场99%的份额,网景公司在当时的美国更是比易中天还如日中天。可是,大家知道这个“网景”浏览器是谁开发的吗?是一个学生,他在大学中不显山不漏水,别的同学每天考虑着泡MM,他却每天除了上课就是泡机房,是上也泡,下也泡,终于泡出了浏览器。
所以说,静下心来,无论其他同学在多么兴奋的展示他们的某某系统,他们的某某网站,既然你选择了学习C语言,那么以韦青青青为榜样吧,总有一天,你会一举成名天下知的。
2、不静
学习C语言,务必不可以急躁,务必一步一个脚印,此乃静心。但是,学习C语言,也不可以太过沉默,一个人呆在机房里闭门造车妄想着创造出某个绝世程序然后成为中国的比尔盖茨是不可能的。
学习靠自己,所以大部分时候我们需要自己思考、闭关修炼。但是一个人的力量终究是有限的,很多时候我们需要借助外力。比如不懂的地方咨询老师,不明白的地方可以与同学相互讨论等等,都是可以的。
有很多同学,学习时碰上困难,遇上了麻烦,于是自己冥思苦想——这是对的——还是得不到结果,于是故意回避不闻不问——这是自欺欺人。有同学说,那是因为无人可问,问老师,貌似大学老师总是神龙见头不见尾,根本找不到;问网络大虾,网络大虾们经常不在线,就算在线,面对洋洋洒洒的留言也视而不见,更别提回复了;问同学,别提了太丢面子!大家同学而已,为什么要问他,问他岂不是说明自己低人一等吗,不问!
其实,大学之中同学之间相互讨论是最可行的一种做法,毕竟一个王重阳没有时间指点全真七子,网络大虾比投名状中的兄弟还不可靠,所以除了自己多思考就是同学之间多讨论了。不要担心问问题会低人一等,老祖宗有一句话叫做“不耻下问”,虽然你的水平比我低上一点点,但是,我不觉得向不如自己的问提问是耻辱。多好的阿Q精神啊,用这点!
只有静心,才可以更好的学到知识;只有不静心,才可以更快的学到知识。
(二)深入不深
1、深入
学好C语言,就一定不能浮躁,要深入的学习知识。
其实,以上的话就极其浮躁,极其不深入。谁不知道要深入学习啊,但是你的告诉大家,到底什么内容属于深入学习的内容。
其实,浮躁就是学习知识就是浮于表面,没有深入理解专业知识。表现在编程上就是只想编写一些所谓漂亮的、能够拿得出手的程序,而对于一些底层的支持程序置之不理。
有的同学喜欢编写一些漂亮的程序,比如设计漂亮的网页,使用某某工具开发某某‘大型’系统等等,当然这都是人之常情。正如鲁迅先生所说,文章写出来总是希望拥有更多的读者,除非是写给恋人的。程序编出来,总是希望拥有更多用户,除非是专门为爱人开发的。但问题是,只编写这类程序是不够的,是有缺陷的。
这些所谓的程序,往往只需要对知识应用,并不需要刨根究底研究知识的本身,甚至有很多加入了很多相当专业的内容,并不适合于初学者学习。比如VC中的MFC就是一个典型的误导初学者的工具。利用MFC可以很方便的编写出DIAG界面程序或者视图文档程序,从表面上看风光无限,但对初学者却祸害无穷!假如使用VC学习C++,大部分时间将用于消息的处理,控件的处理,还要阅读大量的视图文档结构类库说明,这些操作将耗费了你大量的时间,得不偿失。而且VC++的大部分编程是在某些位置插入代码,至于C++部分系统自动实现了,留给你的是纯C语言操作。同学请注意,你学习的是C++,不是VC类库,也不是VC操作!
如使用数据结构,就必须自己编写有关链表、队列和栈等内容,你是在学习,又不是工作,当然得用自己编写的东西呢。
又比如说C语言的内存分配函数,就是那个malloc和free。一般人直接调用就行了,但是计算机专业的学生不应该止步于此,而应该思考这两个函数的系统实现方法,并且编程序模拟内存分配和释放。设计这样的程序,不但可以增强动手能力,还可以加深对计算机知识的理解,一举多得,何乐而不为。
2、不深
深入学习C语言是极其应该的,但是大家也必须有所侧重,不能胡子眉毛一把抓,所有的东西统统深入,具体表现在两个方面:
其一、一些知识范围不可过于深入。
有一些知识,属于偏僻的内容,既不是基础,日后工作中也很难碰上,而且还极度困难,像这样的东西,了解即可,完全没有必要深入。比如说某同学心血来潮,要编写一个漂亮的输入法软件,于是苦心学习了有关输入法的所有知识,还妄图气死清华紫光,饿死搜狗拼音,于是仔细研究输入法的犄角旮旯。其实这些知识均相当偏僻,了解即可,完全没有必要打破沙锅问到底。
其二、一些界面或者不必要的功能不可过于深入。
大家编写的程序,往往伴随大量的交互式界面设计。事实上,编程有个二八原则,即编写80%的核心内容将耗费你20%的时间,而另外20%的功能将耗费你80%的时间。实际上,作为C语言学习,深入编写好那80%的核心功能就可以了,耗费80%的时间去深入完善那些20%的功能,得不偿失!
所以,练习用的程序,最好是一些基础的、底层的实现,不要有太多花俏的图像和交互式操作。当然也可以设计一些简单的具备图形界面的小游戏,但此时你应该将精力更多注重于游戏本身的设计,而不是游戏的画面风格和动画效果上。
学习C语言,有所为有所不为。
(三)枯燥不枯
1、枯燥
学海无涯苦作舟,学习当然是一个枯燥的过程。用语言设计程序,表面上程序漂漂亮亮风光无限,其实风光的背后是黑漆漆的屏幕和冗长的代码。程序员是把美丽献给别人,把枯燥留给自己的职业。
所以,学习C语言,就必须多设计一些枯燥的、无趣的实例。当flash程序员在展示图片时,C语言程序员要去学习空洞的0和1的图片格式;当Java程序员设计网站时,C程序员要去理解抽象的HTTP协议;当.net程序员使用对象托管时,C程序员总是要考虑内存的申请与释放;当C++程序员在欢乐的使用STL库时,C程序员必须自己搭建所有的数据结构。
在C语言的学习路上,绝对没有学习其他语言那么多鲜花,这是每一个C语言爱好者必须接受的事实。
2、不枯
其实,人都是需要动力的,凭什么别的程序员可以通过漂亮的程序享受MM的崇敬和同学的赞叹,而C语言程序员就只能在0和1的世界中与电脑沟通。其实,学习C语言的过程完全可以是快乐的。
大家在基础内容了解的差不多时,完全可以循序渐进设计一些简单的趣味游戏程序,从贪吃蛇到俄罗斯方块,从搞怪碰碰球到连连看,从扫雷到雷电,甚至还可以是植物大战僵尸和愤怒的小鸟,编写一些在界面上简化的趣味游戏程序来,同意可以激起自己的兴趣并获取老师、同学尤其是MM的阵阵掌声。
枯燥,是因为学习并非玩耍。不枯,是因为要像玩耍一样的学习。
四、四项注意
(一)错误观点:C语言低人一等
由于C语言常常应用于一些服务器程序,没有漂亮的界面,在一些同学的心目中,C语言程序员就成了IT民工的代名词。类似于煤矿工人,整天生活在地底下。而那些Java程序员,.net程序员则成了白领丽人。
(二)错误观点:C语言高人一等
与第一种情况相反,一部分同学则认为C语言才是语言正统。俗话说:真正的程序员用C,聪明的程序员用delphi。那么其他的语言统统是神马牌浮云,不值一提。其他的程序员,无论聪明也好,愚蠢也罢,都是盗版水货。
(三)错误观点:C语言是忠贞情人。
弱水三千,只取一瓢。有人在爱情上的忠贞,有人去在语言上忠贞,有人如斯内普般一生只爱一个女人,有人欲效仿之,一生只使用一种语言。
正如人生而平等一样,其实,语言也没有高低贵贱之分,只有适合于不适合之分。Java适合做WEB开发,C语言适合服务器,C++适合做游戏,等等。真正的程序员,不是只使用C语言的人,而是到什么山唱什么歌。任何语言、任何数据库、任何操作系统对他来说都只是工具,呼之能来、来之能战、战之能胜、挥之能去。当JQuery方便时,我不直接用JavaScript;当速度优先时,我不用Java;当稳定优先时,我不用Windows。总之,倚天剑也好,屠龙刀也罢,统统是工具,为我所用,为我所奴役。
(四)光说不练假把式
学习C语言的真言是“编”,但是也有同学会反驳,“这么简单的程序,也需要我亲自编写吗?”、“这个程序我看一眼就知道怎么做了”、“跳过这个程序,直接编写后面的程序”、“不要把天才浪费在这种小程序上”等等之类的言论不绝于耳。
上面其实就是典型的“眼高手低”。
大家在高中学习数学时常常有这样的体会:一看就会,一做就错。计算机编程其实也是一样,咋一看简简单单,谁都可以说出个丁三卯四来,但是真正上一实战,手也抖了,腰也弯了,脑袋也浆糊了。要么半天写不出一行代码,要么编译就是报错,怎么查也查不出原因之所在。
所以,这里奉劝各位“高手”,实践出高手。是骡子是马,拉出来溜溜。请那些所谓的“高手”先试着做一两个作业,真正得心应手一气呵成才才是真正的高手,否则,老老实实的地毯式编程吧。