怎么快速学好C语言

开始入手并且很长一段时间都没法接触到平常常用的视窗程序,由此好奇者有之,迷惑者有之等等,更遗憾的是也有少部分人由于困惑对编程逐渐失去兴趣。第二就是今天妹妹看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>main(){ char string[81]; int i,num = 0; char c; 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>main(){ char string[81]; int i,num = 0; char c; 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>main(){ char string[81]; int i,num = 0,word = 0;/word标志位/ char c; 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思路不但正确并且还在编程的过程当中使用了一些编程技巧,全部这些开阔的逻辑思路(解决问题),快速的调试方法及过程(发现错误),累积的编程技巧(让程序让“好看”)都须要咱们在编程实践中去得到,这是宝贵的经验也咱们做为程序员最珍贵的地方,并且最重要的这些经验是属于咱们本身的,独一无二的。工具

三、二者之间的关系学习

综合上面的叙述,咱们把编程当作程序设计语言的“单词”“语法”“明确的语义”“正确的语义”四个部分,能够看出前面三个部分是几乎全部的程序设计语言自身所具备的,“单词”“语法”不一样的程序设计语言有所不一样,但若是你仔细观察全部的程序设计语言,能够分红几类,并且有不少地方也有相通的地方,有点象一通百通的味道,这也就是为何不少有经验的程序员能够在很短的时间就能熟悉其余语言的缘由。至于“明确的语义”这是全部的程序设计语言都应该具有的,只是表述的方法因为程序设计的“单词”“语法”不一样表述不一样而已,但让计算机明白该作什么这点是相同的。最后“正确的语义”包括开阔的,正确的逻辑思路以及发现并纠正错误的能力则是属于咱们本身的,这也是咱们区别于其余人的地方,这些都须要在常常性的编程实践中去积累去开阔,因此是咱们所应该关注的重中之重。跟许多前辈同样,我是建议初学编程者先熟练掌握一门语言的,至于怎么学习,我想书本是纲领,咱们首先要熟悉一门语言的粗心大意,在编程的过程当中不至于总是去翻书查找一门语言的基本语法,好比说函数的传递方式,函数调用的一些特色,这样不只很是浪费时间并且一直困扰于语法中使得本身有种身缘“庐山”中的那种很是迷茫的感受。就象施工同样,建造一个茅屋可能没有图纸,抱着边建边看的态度兴许能完成(事实上你本身脑海里至少也有个大体的样子),但要建造一座大厦,没有图纸,困难可想而知。固然光有图纸仍是不够的,咱们可能在施工的过程当中发现一些问题,这样咱们在慢慢修改原来的方案或者原先有些地方描述不清楚经过具体施工确认咱们的想法。所以编程实践一样不可少,编程实践不只能够“让语义正确”即开阔编程思路,发现错误(调试),累计编程技巧,并且能够在编程过程当中熟悉这门语言,熟悉这门语言的细节部分,但也请记住这些细节虽然重要,但也仅仅是细节。固然光看书,光有理论那也是不行的,有“纲领”而没有“章程”,有“纲领”而没有实施那一样也是没用的,毕竟实践是检验真理的惟一标准,实践过程当中给理论修枝剪叶。总得来讲熟悉一门程序设计语言的语法是编程实践的先行,而编程实践是能够更好促进对程序设计语言基本语法知识的理解和熟悉,而积累的宝贵的编程经验则咱们本身最珍贵的地方,最独一无二的地方,是全部程序设计语言所没有的。测试

相关文章
相关标签/搜索