如何学好c语言才c语言

&&/&&&&/&&
前言:两个原因促使我写下这篇文章,第一就是作为过来人根据我自己的经验我知道编程的初学者一般都很兴奋也都有种困惑,一方面对运行在计算机(注:不特别指明都指个人微型计算机)的五花八门如精彩的游戏程序,多姿多彩的网站等等漂亮的视窗程序所着迷,另一方面大部分的初学者(如计算机专业的低年级学生)都是从简单命令行程序&Hello world!&开始入手而且很长一段时间都无法接触到日常经常使用的视窗程序,由此好奇者有之,迷惑者有之等等,更遗憾的是也有少部分人因为困惑对编程逐渐失去兴趣。第二就是今天妹妹看C程序设计语言(潭浩强的那本,相信大部分学过C语言的人都听过)碰到一个例题没有看懂,而作为计算机专业毕业的老哥自然义不容辞地承担起了讲解的任务,在噼里啪啦的大说之后,老妹终于弄懂了例题程序的意思,但仍然不过瘾,竟然问起我如何学好C语言,弄得我心一惊,这里我还是有点自知之明的,因为我知道我并不是什么大师,甚至自己对计算机世界也经常是一片茫然,不过看着她那&崇拜&的眼神,不说点什么似乎有点不大好,只好硬着头皮把自己以前的一些理解讲了一番。所以既然知道有这个需要,尽管自己见识浅薄,也抱着&区区陋见假如能够对后学者能够有所帮助那是再好不过了,即使有所偏颇当当笑话看看能有助于大家饭后生活也是美德一件&的心情就写下了这篇文章。
我是很乐意将计算机(程序设计)语言跟人类语言做类比的,在我看来学习程序设计语言就象学习外语一样,通过计算机语言与计算机交流就如同在使用外语与老外交流一样。通常学习语言比如英语有单词,语法,语义三个部分组成,单词是构成语言的最基本的要素,语法告诉我们单词如何构成语句,语义则告诉我们单词构成的语句的意思,类似的程序设计语言中也是有[1] &单词&,&语法&,&语义&三部分组成,其中跟人类语言一样,&单词&&语法&是基础,而为达到交流的目的&语义&是整个程序设计语言的重点。当然相对人类语言(以英语为例)而言程序设计语言(以C语言为例)显然要有简单得多的组成,所以这里我们要首先确立自己对学好程序设计语言的信心。下面试着加以说明,其中可能有些类比不太适当,不过好象也差不多吧,你自己也可以试着举出更好的例子以使自己更容易明白,我这里就抛砖引玉吧。
先从&单词&谈起,在英语中就是由26个英文字母以及26个英文字母构成的单词组成,学习语言我们首先应该记忆的就是&单词&,26个英文字母A,B,C,&&然后就是令人头痛的英文单词,记忆的过程是痛苦的至少我学英语时最恼火的地方就是反复记忆老是忘记的单词,类似的在C语言中我们可以作这样的类比,C语言的单词是由26个英文字母、数字(0,1,2&&9)、运算符以及其他特殊符号组成,所以相比而言学习C语言是多么的幸福。
&语法&,在英语中是如常见构词法、时态、常用句型、特殊用法、固定用法等等(呵呵,不是语言专家如有兴趣可以参考英语语法书籍),仅拿构词法来说动词后面加er就变成名词(work-worker),名词后面加y就变成形容词(wind-windy)等十多种变换还要记忆些特殊变换,复杂且繁琐,假如算上时态、句型等那就更复杂了。在C语言中也同样也存在有语法,比如标识符、常量、表达式、数据定义、函数定义、变量初始化、语句构成、预处理命令等大致8种语法,如标识符[2]可由字母、数字以及下划线组成,且必须以字母或下划线开头,区分大小写,另外在不同的编译器中字符数目有不同的规定,一般为7个字符。不过这里有些可能会被忽略的就是书写格式,在C语言中书写格式也是需要被注意的,因为格式也可以当作C语言的语法项目,如语句是以分号&;&作为结束的标志的而不是以换行作为结束标志,其实英语也有要求比如什么时候该使用句号什么时候该使用逗号等等只不过我们日常要求并不注意,而且也可以看的懂所以不太较真。
综上所述我们要学好一门程序设计语言首先就要象学习英语一样先熟记至少要熟悉这门语言的&单词&和&语法&然后才能谈得上使用,俗话说&万丈高楼平地起&,学好C语言的必要前提就是先打下坚实的C语言基础,所以潭先生的书作为一本很好的教材,我建议是不能丢的,而且还要反复看,至少刚开始我学习的时候上机机会不多,就是反复看懂看明白这本书,有些东西该记的还是要记尤其是一些重要的语法比如标识符、数据类型、语句的特点、函数的栈式结构,指针的意义等等。
最后始终记住这点在没有实践之前,先打下坚实的理论基础吧,毕竟理论是实践的先行,理论可以更好的指导实践。即使再低点的要求至少要先熟悉理论吧,毕竟&摸着石头过河&感觉还是盲目以及痛苦的。
&语义&即语句的意思、含义。同人类语言一样,程序设计语言最重要的目的还是&交流&,所以写一段没有任何作用的代码就如同说一句没有任何意思的话是没有意义的,在这一点上两者是共同的,至于在其他某些方面两者也有惊人的相似之处,试举一例吧,比如说可以有不同的表达表示同一个意思,如微型计算机同个人计算机就是同一个意思,在C语言中比如要让变量i自增1,可以有i=i+1或者i+=1等等。不过与人类语言相比,程序设计语言毕竟是与计算机交流,交流对象计算机与人类的不同也决定了程序设计语言与人类语言还是有所区别,甚至可以说是存在巨大的&鸿沟&,这也就是学习程序设计语言的重点。
与人类相区别,计算机最大的不同之处在于没有&自己&的&思维&,没有象人类那样丰富的感情,所以在交流过程中对于人类的跳跃性的思维,对于人类的&幽默&无法理解也没有丝毫的兴趣。比如说对与同样一句话&Do it&,在不同的场景不同的说话语气,对10个人来说就会有10种不同的回答,有的人可能会认为这是合理的要求,有的人可能会认为这可能是个玩笑而不与理睬,有的人则可能认为语气要求有些过分而感到非常愤怒&&,但对所有的计算机来说则是严格执行。不过也正是由于计算机&机械&&笨着&的可爱而深得人们的喜爱并被广泛使用,因为对我们来说,计算机就象一个忠实的士兵一样在执行我们的命令并且作为指挥者,当然我们希望计算机在合适的时间干切当的事情。而要达到这个目的,很凑巧有点类似于社会的&权利与义务&法则一样,我们也有自己的义务那就是下达明确而又正确的&命令&。
首先明确,即我们要在与计算机交流时&语义&必须明确,否则计算机将无所适从,因此作为交流工具的程序设计语言的&语义&也必须是能够明确无二义的。当然程序设计语言的设计者已经注意到这一点,在设计时就回避了这个问题,所以我们&&程序设计语言的使用者&&程序员也就无须过多关注这点,也就是说使用何种程序设计语言(C,Basic,Pascal等)并不是我们要关注的重点。
其次正确,包括正确的输入以及正确的逻辑。由于计算机 &忠实&得有点&盲目&以至于对事情的对错毫无判断力,就象一把枪一样,在警察手里它就是正义的化身,而在土匪手里就成了恶魔的代言人,因此要时刻记住计算机是没有错的,&错误&掌握在我们自己手里,这也就决定了我们在编程时是不是应该投入更多的精力来纠正我们自己所犯下的错误上面来?除此之外,我们智慧的结晶&&程序,在我们的上帝&&顾客,在程序的使用者看来就象个黑匣子,他们只管输入哪怕是错误的输入却同样期待能得到正确的结果,而对于上帝我们除了祈祷和期望之外还能有什么选择?因此对于输入的不可预期的程序源数据,我们是不是也应该花更多的时间进行处理呢?
先小结下,由于我们在编程时需要对于输入的不可预期的程序源数据以及提高我们自己的逻辑正确性花费更多的时间,因此这也就是我们编程训练所应该关注的重点,而不是关注于何种实际的程序设计语言。
为了加深印象,下面我们举个实际的例子来说明这点。先看题目要求&输入一行字符串(全字母或空格),统计其中的单词数量,单词之间用空格分开&,应该说这是个简单的题目,有些人可能一看到这个题目很快就给出了自己的答案。如有些人会想单词是以空格分开的,我们统计其中空格的数量再加上最后一个单词不就是单词的个数吗,因此便很快给出如下答案。
/*Program1*/
#include&stdio.h&
& & char string[81];
& & int i,num = 0;
& & gets(string);
& & for(i = 0;(c=string[i])!='\0';i++)
& & & & if(c == ' ')&
& & & & & & num++;
& & printf(&There are %d words in the line.\n&,num+1);
编译运行,然后输入&I am a student&,得出正确答案&There are 4 words in the line.&在输入几个类似的测试用例,都得出正确答案,最后确信无误便自信满满的交出自己的答卷。应该说正确的输入情况下,这个程序毫无疑问是能够正确运行的,但这种正确性是非常脆弱的,你不能指望用户和你一样聪明并且不犯错误,何况即使是神仙那也有打盹的时候。假如用户输入& I am a student&,& I&& am a student&, &&& I am a&& student& &&&这种情况下,你是不是应该重新修正你的思路呢?现在我这样考虑一个单词应该是字母后面紧接着一个空格或者结束符号,所以重新写下如下程序。
/* Program 2*/
#include&stdio.h&
& char string[81];
& int i,num = 0;
& gets(string);
& for(i = 0;(c = string[i])!='\0';i++)
&&&& if(c != ' ' &&(string[i+1] ==' '|| string[i+1]== '\0'))
&&&&&&& num++;
& printf(&There are %d words in the line.\n&,num);
运行一遍,发现结果是正确的,单词之间不管你是有几个空格,不管是两个也好,三个也好都能够正确运行,但是回过头来我们看下这个程序是不是还有些可以改进的地方呢?我们再看如下一个程序
/* Program 3[3]*/
#include&stdio.h&
&char string[81];
&int i,num = 0,word = 0;/*word标志位*/
&gets(string);
&for(i = 0;(c = string[i])!='\0';i++)
&& if(c == ' ') word = 0;
&& else if(word == 0)
&&& & word = 1;
&&& & num++;
&printf(&There are %d words in the line.\n&,num);
输入测试用例也能够完全正确,看看源程序,其中增加了一个标志位便把所有的情况给考虑进去了,相比前一个程序,程序2就是直白的描述了解题的思路,而程序3看起来好象不好理解但似乎更能满足我们作为&天才程序员&的欲望,这也就是编程时使用的一些小技巧。
总体比较三个程序,可以说类似程序1的错误&&逻辑错误是我们程序员比较容易犯的,也是在编程调试过程中最费时间的,至于语法错误编译器可以很快的给我们找出错误的地方程序2逻辑正确但相比程序1思路要更难想到,程序3思路不但正确而且还在编程的过程中使用了一些编程技巧,所有这些开阔的逻辑思路(解决问题),快速的调试方法及过程(发现错误),累积的编程技巧(让程序让&好看&)都需要我们在编程实践中去获得,这是宝贵的经验也我们作为程序员最珍贵的地方,而且最重要的这些经验是属于我们自己的,独一无二的。
3、两者之间的关系
综合上面的叙述,我们把编程看成程序设计语言的&单词&&语法&&明确的语义&&正确的语义&四个部分,可以看出前面三个部分是几乎所有的程序设计语言自身所具有的,&单词&&语法&不同的程序设计语言有所不同,但如果你仔细观察所有的程序设计语言,可以分成几类,而且有很多地方也有相通的地方,有点象一通百通的味道,这也就是为什么很多有经验的程序员可以在很短的时间就能熟悉其他语言的原因。至于&明确的语义&这是所有的程序设计语言都应该具备的,只是表述的方法由于程序设计的&单词&&语法&不同表述不同而已,但让计算机明白该做什么这点是相同的。最后&正确的语义&包括开阔的,正确的逻辑思路以及发现并纠正错误的能力则是属于我们自己的,这也是我们区别于其他人的地方,这些都需要在经常性的编程实践中去积累去开阔,所以是我们所应该关注的重中之重。
跟许多前辈一样,我是建议初学编程者先熟练掌握一门语言的,至于怎么学习,我想书本是纲领,我们首先要熟悉一门语言的粗枝大叶,在编程的过程中不至于老是去翻书查找一门语言的基本语法,比如说函数的传递方式,函数调用的一些特点,这样不仅非常浪费时间而且一直困扰于语法中使得自己有种身缘&庐山&中的那种非常迷茫的感觉。就象施工一样,建造一个茅屋可能没有图纸,抱着边建边看的态度兴许能完成(事实上你自己脑海里至少也有个大致的样子),但要建造一座大厦,没有图纸,困难可想而知。当然光有图纸还是不够的,我们可能在施工的过程中发现一些问题,这样我们在慢慢修改原来的方案或者原先有些地方描述不清楚通过具体施工确认我们的想法。因此编程实践同样不可少,编程实践不仅可以&让语义正确&即开阔编程思路,发现错误(调试),累计编程技巧,而且可以在编程过程中熟悉这门语言,熟悉这门语言的细节部分,但也请记住这些细节虽然重要,但也仅仅是细节。当然光看书,光有理论那也是不行的,有&纲领&而没有&章程&,有&纲领&而没有实施那同样也是没用的,毕竟实践是检验真理的唯一标准,实践过程中给理论修枝剪叶。
总得来说熟悉一门程序设计语言的语法是编程实践的先行,而编程实践是可以更好促进对程序设计语言基本语法知识的理解和熟悉,而积累的宝贵的编程经验则我们自己最珍贵的地方,最独一无二的地方,是所有程序设计语言所没有的。
4、写在最后面的话
写到这里,我想现在应该是回答第一个问题的时候了,有人说我学了这么长时间的C语言还是没编过一个漂亮花哨的程序,编出来的都是丑陋的而且看起来没什么价值的程序,一点自豪感都没有便丧失了对编程的兴趣,为什么前面我一直强调一门语言丰富的编程经验是你最珍贵的地方呢?原因就在于编程不仅仅是把我们的想法把我们的思路用程序设计语言写下来就够了,要得到实际运用还需要与计算机的其他知识如网络,低层硬件,图形图象,开发环境等,甚至还有其他学科知识比如自动控制,通讯等相结合,而这些知识需要我们在以后的学习过程中学习,比如一些后续课程,数据结构与算法,操作系统,数据库,计算机网络,软件工程等等,如果有兴趣你也可以在以后的课程中专门学习视窗程序的编程,或者也可以学习自己做个网站,那时侯就真的是有自豪感并且货真价实的了。当然那时侯可能你会有另外的想法比如说做嵌入式程序员,网络程序员,甚至去搞算法研究等等了。不管你选择做什么,书本知识都是大家所共有的,是全人类的财富,而自身的知识,尤其是经验却实实在在是你自己的,最后我还想强调一遍,这是我们最珍贵的地方。
所以在此之前,我知道打基础是痛苦而且没有多少成就感的过程,但是在化蛹成蝶之前,我们还是要继续我们做而且认真的做我们的毛毛虫,因为我们知道我们会有变成美丽蝴蝶的那一天。
微信公众号:
各位粉丝,大家好,我是C语言中文网的站长(可以了解我),C语言中文网已经开通了微信公众号,名字是「码农宿舍」(不是C语言中文网哦),我将在这里和大家交流编程知识以及工作经验。大家可以搜索名字「码农宿舍」关注,也可以用微信扫描右边的二维码关注。
当你决定关注「码农宿舍」,你已然超越了99%的程序员!
推荐文章 TOP1008-3108-2408-3108-29
10-2301-0509-1211-12
◇本站云标签苹果/安卓/wp
苹果/安卓/wp
积分 17142, 距离下一级还需 1158 积分
权限: 自定义头衔, 签名中使用图片, 设置帖子权限, 隐身, 设置回复可见, 签名中使用代码
道具: 彩虹炫, 雷达卡, 热点灯, 雷鸣之声, 涂鸦板, 金钱卡, 显身卡, 匿名卡, 抢沙发, 提升卡, 沉默卡, 千斤顶, 变色卡下一级可获得
道具: 置顶卡
购买后可立即获得
权限: 隐身
道具: 金钱卡, 雷鸣之声, 彩虹炫, 雷达卡, 涂鸦板, 热点灯
TA的文库&&
哼哼签到天数: 38 天连续签到: 1 天[LV.5]常住居民I
第一部分:如何学好C语言?我相信,这可能是很多朋友的问题,我以前也有这样的感觉,编程编到一定的时候,发现能力到了瓶颈,既不深,也不扎实,半吊子。比如:你长期地使用Java和.NET ,这些有虚拟机的语言对于开发便利是便利,但是对于程序员来说可能并不太好,原因有两个:一段时间后,你会发现你知其然,不知所以然。。我以前在CSDN上写过一篇《Java NIO类库Selector机制解析(,,)》,在那篇文章中我说提到过(有讥讽的语气)Java的程序员不懂底层实现,所以很难把技术学得更扎实。此时,一部分程序员会不自然地想学学底层的技术,很自然的,C语言就被提了上来。下面是我给这位朋友的一些建议:如果你能在2-3年内精读完这些书,并全部融会贯通,那么你就明白什么是一览众山小的感觉了!我足足花了5年时间才算是真正全部读完这些书的。最后,祝你好运!努力!我想,这篇文章主要想告诉大家这么几件事:高手往往都是有很强的系统的基础知识的,表面的东西永远是肤浅的。第二部分:如何学好C++?C++是最难的语言。这个世界上最难的编程语言可能非C++莫属了。你千万不要以为,C++的学习曲线是相当BT的,你可以看看。C++是一门很自由的语言,自由到了有点。我甚至认为C++并不是一门成熟的编程语言,因为太容易犯错了。所以,你一定要在一开始就要有很小心谨慎的态度,并把C++当成一种难以训服的猛兽来看待。多问“为什么要这样”的问题。学习C++一定要多问几个“为什么是这样”,“凭什么要这样”的问题。比如:很多人知道C++有拷贝构造函数和初始化列表,但你真的知道为什么要有拷贝构造函数?为什么要有初始化列表吗?为什么要有template,为什么要有RTTI,为什么不是别的呢?难道就是为了让一门语言变得Cool一些吗?完全不是这样的,C++中的任何一个feature都有些实实在在的原因,你一定要去了解为什么要把C++设计成这样的原因,你才能学好C++。有空看看《》一书。看书,大量的C++书。你可以按如下先后顺序阅读(下面这些书,我花了大约4-5年的时间,今天我还在随时温习)《》,这本初级读本可能让会你啃得很痛苦,所有的语言的特性和为什么都在里面了,好好读读。当然由C++之父写的《》也不错。两本看一本就好了(我看的是前者)。了解C++的语法仅仅是万里长征的第一步,你还需要看看《》和《》这两本书并不厚,但我从02年就一直看到现在,每次读我都有新的体会,这两本书太经典了。如果你对C语言不熟,这两本书会让你回去补C语言的课。同样是另一本经典之极的书,学c++必读,但是中文版的翻译的很不好,所以还是去读英文版的吧。《》同样非常值得一读,这里教的不是编程,而是思考的方法,这是相当珍贵的。《》和《》让你看看各种问题的解决方法和一些常见的经典错误。《》和《》可以让你知道C++各种神奇的用法。《》是把C++实践到了极致的东西。很强大。STL――神一样的模板库(容器,算法和函数对象),不得不服。《》让你了解编译器下的C++是什么样的,让你了解C++的性能并不差。这个对于C++的程序员太关键了。我以前写过的《》还有《》属于这个范畴。和Java语言做对比。我个人以为Java对C++这个并不成熟的语言做了很多调整,规范和限制。所以,对比一下Java和C++,想一想,为什么一些东西在C++中可以做,但在Java中却不行。比如:Java的异常是必需要catch的,不然就会编译不通过。为什么Java不提供操作符重载?为会Java会引入接口来做多重继承?等等。Java体现着很多面向对象设计的东西,学习Java有助于你学会怎么更好地使用C++来编程。面向对象设计&。虽然。但是我觉得面向对象设计中的一些实践非常的不错,比如,单一原则,依赖倒置原则,等等,都非常地经典。《》必需一读,《》可以一读。但不可以设计模式为中心来编程,而应该是用设计模式来解藕。类库学习。看看MFC是怎么封闭Windows API的,看看ACE是怎么面向对象的,看看boost是怎么玩面向对象的,看看CPPUnit又是怎么设计的。当然,,可以参考。&&&&希望没有吓到大家,并欢迎大家补充。注:本文进行了综合剪辑和编加,选编自陈浩老师在酷壳网的博客、以及他在IT技术学习上的博文,在两文之间进行的综合整理-------对于学习C语言和C++,不仅指明了学习路径和方法,理论体系和有益的建议,更为大家提供了学习资料和书籍清单,丰富足料!
载入中......
发表于40楼
更好的学习路径应该是先学面向对象C#,接着学算法与数据结构,然后学C#与C++混合编程,最后学习汇编与反汇编。
chenyi112982原来也会C语言和C++
总评分:&经验 + 70&
学术水平 + 5&
热心指数 + 5&
信用等级 + 5&
本帖被以下文库推荐
& |主题: 1284, 订阅: 464
任何一种学习,就其本质而言,都是从提问开始的
爱问就有答案,酝酿好答案的感觉就像千年狐狸吐出内丹......
回帖奖励 +3
C++ Primer,一本久负盛名的C++经典教程
回帖奖励 +3
算法导论,“五个一”,即一章介绍一个算法、一种设计技术、一个应用领域和一个相关话题。
回帖奖励 +3
谭浩强、侯捷、潘爱民的系列丛书
回帖奖励 +3
回帖奖励 +3
回帖奖励 +3
回帖奖励 +3
虽然过了二级C,但什么都不懂
回帖奖励 +3
初级学术勋章
初级学术勋章
中级学术勋章
中级学术勋章
高级热心勋章
高级热心勋章
高级信用勋章
高级信用勋章
中级热心勋章
中级热心勋章
初级热心勋章
初级热心勋章
初级信用勋章
初级信用勋章
高级学术勋章
高级学术勋章
特级学术勋章
特级学术勋章
特级热心勋章
高级热心勋章
中级信用勋章
中级信用勋章
特级信用勋章
高级信用勋章
论坛好贴推荐
&nbsp&nbsp|
&nbsp&nbsp|
&nbsp&nbsp|
&nbsp&nbsp|
&nbsp&nbsp|
&nbsp&nbsp|
为做大做强论坛,本站接受风险投资商咨询,请联系(010-)
邮箱:service@pinggu.org
合作咨询电话:(010)
广告合作电话:(刘老师)
投诉电话:(010)
不良信息处理电话:(010)
京ICP证090565号
京公网安备号
论坛法律顾问:王进律师

我要回帖

更多关于 学好c语言 的文章

 

随机推荐