大数据

C语言学到什么程度可以做项目?

很多初学C语言的小伙伴,在学习之初并没有一个大概的概念,学习这门语言需要掌握多少知识点,怎么才算学的差不多?

C语言的精髓点在哪? 学到多少东西才能够达到做项目的标准?学习的时候需要注意哪些细节点?疑问太多以至于压得自己喘不过气来。小编从项目的角度分析C语言到底需要掌握哪些知识,为什么要去掌握这些点,怎么去掌握,在此尝试着总结以下几点,未必都是对的,起码可以做到亲身经历。

基本的数据操作,运算规则,常见程序结构设计

很多人觉得这么几点我都看了多少遍了,早就烂熟于心了。举个简单的例子,printf打印可能是最常使用的函数了,但是这个函数在真正大型工程中,很少直接去调用,为什么?

主要项目中涉及到封装的概念,什么时机加入打印在调试大型系统的时候,更容易定位问题,这些编程思维对于初学者来说很难接触到,也很难想到,任何复杂的事物都是由简单的细节环绕而成,在学习之初不要觉得这些很简单的数据操作很简单,要真正纳入自己的知识体系还是需要花点心思。可以在学习的时候,网上搜一些资料看这些数据操作以及运算规则是如何使用具体的场景中。

很多人初学者可能会有疑问觉得去哪里找这些代码去,世界软件发展了这么多年,最不缺的就是代码,在github或者开源中国里面代码多如牛毛。学习的对象也是数不胜数。有点扯远了,这触及到另外一个学习编程的步骤,学会看懂别人的代码,然后才能尝试写出优质的代码,知己知彼百战不殆。曾经听一个编码高手说过“技术这东西只要花的时间长,肯下功夫早晚都能搞定,只要进入状态了,什么方法都能想的出来”,看书学习也罢,看视频学习也罢,需要让自己插上联想的翅膀,把自己的思维境界打开。

说到运算规则,涉及到代码的格式的问题,说说身边人的事情,去年招了一个刚毕业的学生,基本功不是很好,但是有一个特质专注力很高,能沉得住气。当初见第一眼就觉得是个做软件的苗子,有了第一印象后面的事情就顺理成章了。很多经验不是很足的同学,参加面试回答的问题也不是很理想,但还是被录取了,其中一个因素就是你身上有公司需要的基因,这多少算来有点运气的成分在里面了。今年这哥们觉得很突然,说为啥当初刚开始写代码的时候为啥不要求那么严格,说了几句话,初学者特别是基础很差的情况下,要求太多只会让一个人慢慢失去对这个行业的信心,也许会错失一个软件天才。随着时间推移能够迈入轨道了,那么就该要求一些基本的职业素养了,代码的格式,就该要求了。很多初学者觉得写的代码越高深,越让人看不懂才叫高手,有这种想法的趁早打住。大道至简,这四个字在任何时候都不过时。做的复杂逻辑混乱只能说明当初在设计的时候,没有彻底想明白,想明白了展示出来一般都比较舒坦平整。

指针,数组,结构体,枚举灵活运用

不要只看这几个字,几乎是C语言里面最精髓的代表。数组这个概念基本上还能理解透彻,说到指针这个应用场景太多,而且在什么项目中几乎都离不开指针的使用。变化无穷,会用的觉得其乐无穷,不懂的哭上天。记得在互联网有个流传很长时间的文章,林锐的我的大学十年(有兴趣的同学可以去网上查阅,编程的人生也可以很彪悍,记得当初发烧期间还专门买了林锐的一本高质量编程)提到了做了一个C语言的项目,为了绕开指针最后全部用数组代替实现了,后来做的项目也黄了。不是说因为用数组使用就不行,项目的定位方向出问题了。用数组完全替代指针这条路也是可行的,但是会花费相当大的周折。

说到指针,不能不提到计算机专业开的另外一个课程,数据结构。数据结构就是原生数据或者组合数据的混合运用的一种规则集合。连接这些数据,将这些数据有机的串联在一起,指针起到非常关键的作用。经常见到初学者说数据结构和天书差不多,几乎看不懂,建议回炉好好学习指针,说到指针还是存在很多故事,在入门之初有幸遇到一位水平极高的老手带着,基本功扎实的不得了,记得有一次使用指针忘记初始化,这老手叹了口气,当年我每次用指针错一次,就被项目经理当众批评一次,后来再也不敢不初始化使用了,所以印象才能这么深刻,话说到这里刚入门的小白挨多少批评或者鄙视,是最正常不过的事情了,这对于编程界来说稀松平常。

结构体在项目中用的特别多,很多初学者觉得结构体都在教材的最后章节,觉得不是那么重要。其实结构体在一定层次上决定着软件的脉络框架。很多高手在设计模块的时候,不是急急忙忙的写代码,而是先把头文件里面的结构体设计出来,简单的来说就是把数据模型先搞起来。有个数据模型代码实现起来就比较轻松了。面向对象里面类的老祖宗就是结构体延伸来的。关于结构体如何赋值,包含着指针的情况下,如何赋值这些都是常见的初学者经常容易掉的坑。枚举一般用在罗列不同类别,存在多个相同功能的实物,搭配switch使用的很多,在这就不一一列举了。

函数的使用

函数是面向过程编程最基本的单位,任何C程序的运行都有函数的身影,因为程序的入口main就是一个函数,函数传值方式,调用方式(递归,回调)都是函数内在的表现。函数的里面又可以嵌套别的函数,使得程序慢慢变得复杂化。前几天和一个非计算机专业的聊天,谈到如何学习函数,说到了数学不好是不是编程不好学。函数的编程基本因子,和数学里面的函数有一定的共性,但编程里面的含义引申的层次更多,数学在一定层面就是提供一个工具或者方法而已,函数的设计里面夹杂着诸多的编程思想。

检验一个程序员水平的高低可以简单让用函数实现一个相对复杂一些的功能,基本上就能看出编程思想掌握的深浅程度。不妨自己实现一个函数,检验下自己编程水准,函数的检验是面试里面必不可少的题目。

一个函数基本上代表一个小的模块,多个模块有机的组合形成一个系统。建议初学者在学习函数的时候,不要满足于会使用函数,还要让自己站的层次更高一点。这能决定自己是一个纯粹的执行者还是未来框架的设计者,不要觉得这些东西距离自己很远,慢慢的积累时间长了,慢慢也就从量变变成质变了。

对于内存和性能有少许的理解

内存和性能对于初学者来说,可能觉得很遥远,其实这两样东西贯穿整个编码界,检验软件功能最重要的两项指标,软件占用内存多少,运行时间长了会不会让系统变缓慢。同时开启在多个软件的时候,你设计的软件是不是变得很卡顿,这些都是大家平常在使用软件时候经常遇见的现象。今天在车上闲聊,司机说当年的XP运行的多好,非要升级搞什么windows7或者windows10之类的,把电脑搞的卡的要死。这其实是微软操作系统设计理念的一个延伸,用空间换时间。说的通俗点,提前把一些常见的软件加载到内存里面,使用的时候流畅度会感觉好一些,理念这么好,为啥还变得这么卡慢,主要机器配置太低了。微软这帮大佬认为你机器内存和CPU还是相当不错的,因为现在硬件成本基本上接近白菜价了。在机器配置还不错的情况下,windows7,10运行的速度还是很不错的。透过这些生活常识,归结对编程,对编码的认知程度上,慢慢就会建立起自己的知识体系。

这点在嵌入式设备上表现的很明显,一般嵌入式设备内存和cpu配置不是高,内存就要省着点用,占用CPU很高的一些函数尽量少去调用,避开雷区,这些经验就要靠平时多去积累,多去思考,才会融入自己知识体系,才会慢慢认识到写代码其实在编程时候,只占很小的一部分,大部分的时间还是在思考如何让代码更加利索,内存更少的去使用,cpu占用率低一些。认识到这些时候,层次就不一样了,就会越来越觉得设计思想的重要性了。

唠唠叨叨说了以上四点,可能和里面具体的概念不是很搭边,主要站在项目的角度上做了一些延伸,从项目的角度去认识一些基本的概念,让初学者在学习的时候,有个大致的认识。在知识层次上面稍微做了一些拉伸。稍微上了一点高度,渗入了一些编程思想。希望初学者对此有一个更加深刻一点的认识,不要拘泥于语法的限制,编程语言服务于编程思想。学到了真正的编程思想,才叫货真价实的懂编程。