03.04 为什么这么多人学不会C语言?

小松语录


对初学者来说,C语言确实有一定的难点,但是C语言是基础的语言,并不是最难的所以学不好的主要还是自身的问题。依据本人这么多年的经验,这尝试分析下为何这么多人学不好C语言?

C语言本身存在一定难度

C语言主要应用于操作系统、嵌入式底层开发等,在这些领域C语言一直都咱局主导位置,但是在入门上现在比较热门的php、python、java等语言比C语言稍微容易一些。所以很多人学习到C语言的时候,理解起来很抽象,使用时变化莫测,觉得很难,自己就失去了兴趣,慢慢地放弃了。特别是在指针的学习上,是一个槛,很多人就是倒在指针上的。

当然除了指针,C语言里面还有一些回调、递归、函数指针、指针函数也有一定的难点,所以总的来讲C语言还是有一定的难度 的,学习C语言一定要多练,不能光看书,多做一些项目慢慢地就好了。

意志力不够没有耐心,倒在黎明前夕

学习编程主要挺过去前两年的积累经验阶段,后面就好多了,有些人就是迷迷糊糊的进入技术岗位了不知道到底做的是什么,会有一天发现自己突然明白过来很多的事情,以前有些不明白的事情,突然觉得啥都明白了,看似是一件很神奇的事情,本质上来讲都是日积月累构造成的。

很多人觉得自己学了这么长时间还是很多不明白,就会产生厌倦心里,自己都想要放弃,没有了激情,慢慢地自己就放弃了,其实有时候默默地再坚持一会自己就会慢慢地掌握C语言的精髓,对C语言产生兴趣。

C语言没有别的语言好就业

这涉及一个很现实的问题,学习了编程语言就得找工作,如果学了不好找工作,肯定学习起来的动力就不足,毕竟C语言的工作岗位绝对数量并不少,但是相比java,php,python等语言还是没法比,而且对入门者的要求相对更高点,薪资上也不一定有多大的优势,所以对于初学者没有多大的吸引力。目前这也是当前的市场实际情况。

C语言是不是就不值得学习了?其实这种说法是不对的,其实php,python等底层语言还不是一样用C语言来实现,所以C语言的重要性不言而喻。不要听信C语言已经过时之类的谣言,C语言一直都在默默无闻、踏踏实实地做着底层很重要的事情,经久不衰。想要在软件行业立足发展,C语言还是很值得学习的。


撸车汇


我本人接触C语言也将近10来年了,一直从事Linux C方面的工作,曾经作为培训机构的Linux C语言讲师,也教过数百嵌入式Linux方向的学员,下面我就来谈谈题主提问的问题。

C语言作为一门入门级语言,是大多数编程者的学习首选

据我了解,C语言作为一门入门级语言,大多数人在进入IT行业都要先学习C语言的。比如在大学期间,信息工程系、计算机系、通信工程系甚至机械设计与自动化系都要学习C语言基础这门课。对于第一次接触这门机器语言的大学生们,这无疑像是一本天书!所以很多人说学不会C语言,或者中途放弃,再或者转学其他的。

依稀记得我上大学的时候,每天早上小湖边的那位读着“银它,银它(谐音) i n t”的校友,也许这就是一个刚刚接触C语言的人的真实写照吧。但是如果在学习了C语言的基础上再去学习其他语言比如java语言,那么就会变得相对轻松了。大多数Python、java等语言的学习者也都是从c语言的路上过来的。我相信,如果先学习java,然后再回过头来学习C语言也不会感觉太难吧。

C语言学习过程之枯燥

C语言的学习枯燥主要表现在两个方面,第一个因为它是一门编程语言,跟计算机打交道,

你对它热情以待,它却回报你各种err,无疑是给初学者最大的打击;另外一个方面就是C语言学习并不像学习其他语言那么有乐趣。我的一个学弟,刚开始跟我说以后也想走嵌入式Linux的道路,就在我的指导下学习,天天对着一个Ubuntu的黑框终端敲代码,后来他发现同宿舍有个学习Android的,时不时的搞出来个APP,什么音乐播放器,什么登录系统的,他感觉很有意思,慢慢的他就转行了,受不了Linux c的枯燥。

没有一颗持之以恒的心

刚开始学习编程的那个阶段是最难熬的,一旦等学会了之后,说不定一下子就爱上了它,这是我对学编程的总结。很多人在学编程的路上坚持不下去,就慢慢的放弃了,很多计算机相关专业的毕业生,认为编程是无聊的、枯燥的、学不会的然后就抛弃了走编程的这条路。我身边有不少C语言的大神,他们都是持之以恒坐上现在的这个位置的,什么Linux驱动开发、嵌入式软件开发、c语言开发等等都是C语言学习后的工作方向。

总结

有志者事竟成,只要你有一颗坚定的心,在配上那么一点热情,我相信每个人都会学会C语言的。

以上是我关于C语言学习的观点,谢谢阅读,觉得有道理就给个赞!


嵌入式Linux技术分享


笔者虽然现在很少写C了,但在工作初期有多年C语言工作经验,后续接触过的高级语言就太多了,PHP,JAVA,GO,Python等都有一定深入研究,可以简单说一下我的看法,当然,欢迎关注。


先简单总结一下:

很多C语言的问题要对计算机系统有一定理解之后才能解决,就算有好的教材也不能简单写出bug free的代码。

即使通过看书把C语言入了门,但是坑还是要亲身去踩才能学到东西。

  1. 比如C语言不像Java一样给你很多内置的类,类的方法都定义好了直接用就行了。在C语言里这些都得自己写。。。

  2. C语言也没有Java的垃圾回收机制,还得学着自己管理内存,知道存在栈上的局部变量和分配了内存的变量在存储上的区别。

  3. 还有malloc的坑,分少了会buffer overflow,忘记free了又会造成memory leak。

  4. unsigned int的坑。

不懂对应的系统知识,只能看着非常confusing的bug找不出原因。


然后我们具体看下C语言难在哪些点:


第一 C语言直接操作内存


特别是和内存关联很近主要还是指针的存在,很多人说到指针就头大,指针就是一把双刃剑,能够很好的解决逻辑问题,但指针一旦出现问题,找个问题特别费劲,底层语言直接崩溃对应的查找工具还不多,很多还得靠代码解决,不像高级语言有内存回收,垃圾回收机制。


这就是高级语言比较有优势的地方,并且高级语言参与的人多遇到问题,去解决的人也多,对应的工具也多。解决内存和性能的问题,就难倒了很多意志不是坚定的人。


而且与指针相关联的很多东西,在开始学的时候都不是很好理解,回调函数,指针数组,这也是考验耐性的时候,坚持去理解去学习,也就慢慢挺过去了,其实这些都是基本功能的组合,比如回调函数应用的场景,函数的执行时机已经确定,函数内容实现要根据具体的场景来定,这种在windows编程时候在传递句柄的时候用的多。


要理解回调还得知道函数指针是个啥概念,这种对初学者来说简直就是天书。在学习的时候记住一点先去理解了再去考虑怎么练习,实践。不要上来逮着书本上的练习题目呼呼的去敲代码,要理解个差不多再去动手也不迟。


指针直接的导向就是容易导致内存泄漏,而且如果不是大块的泄漏解决起来都特别费劲,可能需要运行很长一段时间才能查找到,指针的释放位置自己要记录好了,忘记了查找起来相当的麻烦。

第二 C语言工具比较少


很多高级语言很多特性都有丰富的成熟类库,在C语言去实现需要折腾很长时间,这是底层语言不太好的地方,这也就决定了C语言只适合在性能要求比较高的地方去使用,应用研发方面效率很低。

目前来看在嵌入式领域用的还是比较多,特别是在内核驱动,或者操作系统底层实现方面应用的非常广泛,而且这类对于C语言的要求比较高,不是简单写个普通的模块就能搞定的事情。



总结

基于以上几点导致很多初学者倒在入门的路上,本质上坚持的力度不够,谁都不可能在开始学的时候都弄得非常清楚,毕竟天才只有少数。学完之后回来总结C语言也就是十个左右的知识点,懂了也就比较轻松了,后续就是靠自己在项目中的打磨了。


您的转发+关注就是对笔者最大的支持,欢迎关注。

另外喜欢听互联网圈里那些趣闻轶事,或者对大厂架构设计,BAT面试题分享, 编程语言理论这些感兴趣欢迎关注笔者,没有错。



人人都是架构师


这么多人学不会C语言你觉得是什么原因?

是智商原因吗?那我们来看看,不说全世界了,就全中国而言学好C语言的人那么多,里面还有中学学历的人,你觉得是智商的原因吗?

是C语言本身的原因吗?你会说C语言数组、指针、链表太抽象,发明者C语言的人太坏了!C语言及其发明人双手一摊:怪我咯?

很多人学不会C语言的原因,依我看不是智商的问题也不是C语言本身的问题,而是学习者的情商出了问题!你没看错,情商!学习C语言需要用到的情商包括:毅力、定力、心理抗压力和自控力。

这个说来也很简单,别说学C语言了,你就看看平时在上课时你周围的人在干嘛?逃课的就不说了,有睡觉的、看小说的、窃窃私语的、看手机的,别说C语言了,恐怕这种态度连最基本的课程也学不完吧!

你可能会说:“哎,没办法啊,现在主流环境就是这样啊,我如果认真学习会被当成异类的”。可是你想过没有,毕业后大家就像丛林里的鸟儿各自飞,谁还管谁?你当时的不好意思的学习,毕业就就是到处被用人单位鄙视到处碰壁。那么你算一下,是被你周围的主流环境嘲笑合算还是被决定你饭碗的用人单位嘲笑合算?

学好C语言最主要的因素是情商,其次才是智商,最后才是C语言本身的难度。所以为了你的将来、为了你的家人,你要练好自己的毅力、定力、心理抗压力和自控力,不光对你的学习有帮助,对你走上社会也是有很大的帮助的。

另外,我在“C语言编程技术分享”这个公众号里分享了一些C语言的教学文章,希望对各位有帮助!


数字视听科普


作为有8年C语言开发经验的程序员,我觉得我有一点资格可以来回答


首先看什么叫学会C语言

如果只是简单的写出一些循环语句、字符处理等操作,那只能叫你认识这个语言。

真正的学会C语言,你要理解指针、内存、堆栈操作、链表操作,同时需要对操作系统有一定的理解,32位、64位操作系统,使用的数据也不同。


为什么很多人学不会C语言

1.C

语言的入门简单,进阶复杂,如果没有操作系统的一些机制理解,那在开发时,会非常头疼,有时候指针指向某个内存跑飞,你都不知道哪里出现了异常,这也让很多人望而却步;

2.C语言从事的工作比较都比较接近底层,像单片机、芯片开发、内核驱动的开发会用到C语言,需要掌握的知识点很多,一般的公司不愿意找一个C语言经验较低的程序员,这也导致找工作不那么容易;

3.C语言需要大量的习题和项目练习,否则就是埋坑专家,而且C语言真正能快速做出来的项目不多,不像JAVA可以用现有的框架快速的搭一个前后端出来,或者快速的写个APP出来,所以学习C语言要耐得住寂寞,不那么容易有成就感。


为什么要学C语言

C语言是其他高级语言的基础。

在日常的工作中,你不可能一直使用C语言,拿我自己来说,我主要从事于Android系统级的平台开发与高通modem的平台开发,在日常的工作中需要掌握C、C++、JAVA、Python这些基础语言,还需要掌握Shell、Soong、Makefile等脚本的开发。而且这些语言和脚本在平台开发中也是穿插着使用,不同的层会使用不同的语言。C、C++主要使用在Android Nativate C和kernel层 以及高通的Modem层,Java主要用于Android的应用层,Python、Makefile、Soong用于编译过程。


我刚学习和使用的语言是C语言,有了C语言的基础,再学习其他语言将会事半功倍。


我们怎样去写C语言

我学习C语言的时候,主要是大学的基础课程,然后自己练习了《C语言经典编程282例》,每道题目都认真练习,弄清算法原理,内存操作机制,异常处理等等,然后再到参与实际项目中进行运用,要迈过几十上百个坑,才能算是有点成就。


我最近正在写一个《C与指针心得》的系列文章,想了解C语言的,可以关注我。



IngresGe


没有练手机会

学不会C语言的主要原因还是C语言的练手机会太少了。

做web或者是桌面应用的练手机会远远高于C语言的。

以前桌面应用主要是采用C++进行开发的,现在不要说是否还是C++为主进行桌面程序开发,就连桌面程序都已经进入被淘汰的趋势,连手机上的应用都是使用Java或者swift等语言进行开发,以后也许我们只能在嵌入开发中才能看到C语言的身影了。

一门语言连练手的机会都没有,没有练习的机会就等于没有精通的可能。

请不要被各种语言排行榜中C语言的高居不下给欺骗了,这是依靠搜索活跃度排名的,因此没有现实意义。

不过从另一个角度也可以看到这种讽刺,C语言无可取代,工作机会却那么少。




一门越来越边缘化的语言

我说C语言越来越边缘化,不是说C语言的地位不重要,现在很多的操作系统、数据库等软件都是使用C++语言进行开发的,可以说C语言或者C++语言支撑起了当今计算机界,但是令人讽刺的是这个支柱是由少数人构筑的。



令人吃惊的是Java这么流行,而Java这门语音竟然是使用C或者C++开发的,开发Java语言的开发者连使用Java语言的千分之一都没有。

支撑这个社会运行的根基是由少数人创造的,而让这个世界更加美好却需要上千万人采用最简单的工具进行打造。

C语言难吗?



难不难不在于这个语言本身,而在于这个语言本身的环境,C语言的环境是所有语言中最尴尬的,本身的改良和后续的发展远远比不上其他语言。

如果你看看其他语言几年就更新一个版本就知道C语言多么因循守旧了。

指针也许很难,但是也没有难到不可逾越,难到不可精通,难到不可克服,既然是人类发明的语言,那么人类就有可能会学会,一直强调语言的困难,却不去想想工作不靠它你让普通开发者怎么精通?

假如可以依靠C语言养活一大批开发者,我可以保证现在什么三大框架、微服务肯定是C语言架构的,可惜C不是这样的语言,它养不活视它为神物的一大批普通开发者。


从头开始自学java


我本人是一名创业者,同时也是一名编程爱好者,在初创公司有着丰富的工作经验,欢迎关注我,和我一起分享职场,科技,互联网创业等方面的知识。

对于你的问题,我的答案是:C语言学起来不难,花点精力学习要入门也容易,但是要真正的用明白就会特别的困难。

笔者接触和使用C语言编程已经有6,7年的时间了。你可能会问,学了6,7年应该很厉害了吧?如果说到精通或者厉害我真的不敢说,虽然经验丰富,那也只是达到熟练使用的程度而已,现在在编程的过程中还是会时不时的踩到雷,掉进坑。

为什么这么多人学不会C语言,或者是只懂点皮毛。小编把这些年遇到的一些人和事情与你分享一下便知一二。

学不好C语言大概有这几类:

一、爱面子,特别喜欢吹牛皮的人

之前公司有一个做市场运营的同事,以前是做技术的后来转做运营岗。每当公司有做技术的新同事入职的时候,都会问一下新同事技术水平如何,如果遇到毕业生,他就开始吹牛了,吹牛的大概意思就是:之前他干过几年编程,然后说编程很简单,C语言更简单,如果给他学,两三天就搞定之类的话。刚入职的新同事当然是一脸懵逼。当你实际和这种人聊的时候,你问他做过什么项目,一些技术的内幕,他是基本答不上来的。

二、不喜欢专研,没有耐心,只是为了应付考试和工作的人

有很多毕业生,你问他C语言难吗,学得怎么样?很多人会说:以前学校老师讲C语言,我学得很好。老师讲的都能听懂,考试很好。可是当你告诉他们C语言要学会使用很困难的时候,大部分人都是疑惑的。项目中真正遇到问题,他们大部分人选择的都是逃避问题,没有去深究出现问题的原因。

C语言从诞生到现在已经很长的时间了,中间经过不断的优化,最后确定了自己的标准。可是它本身还是存在很多的缺陷的。特别是数组、指针、内存管理这些,在实际运用的时候很容易出现问题。要非常谨慎。

要想少遇到这些问题,最好的办法就是多多实践,多写代码,经常使用调试工具进行调试。在最初做项目的时候,我曾经为了一个数组越界的BUG无休无眠的调试,直到最后找到了问题为止。

后来我转做嵌入式底层驱动的开发,开始大量接触指针。最开始的时候,指针有很多莫名其妙的问题,一不小心指针使用错误,指向不该指向的地方,整个系统就会崩溃,那个时候真的不知道痛苦了多少个日月,市场有想放弃的念头,最后还是坚持了下来。

另外,还有涉及到变量的使用,内存管理,在调用内存块后还要记得释放空间,如果忘记就会导致内存空间不足,直至系统崩溃。

以上谈的这些只是冰山一角。我不是技术专家,不过我要告诉你的是:听明白、看明白不代表你懂了,你懂了不代表你会用了,你会用了也不代表你能够用明白。最关键还是要多多去实践。

不管你要深入任何一门语言,其实都不是那么简单的事情,最后以王国维的《人生三境界》与大家共勉。

古今之成大事业、大学问者,必经过三种之境界:“昨夜西风凋敝树。独上高楼,望尽天涯路。”此第一境也。“衣带渐宽终不悔,为伊消得人憔悴。”此第二境也。“众里寻他千百度,蓦然回首,那人却在灯火阑珊处。”此第三境也。

喜欢我的回答请关注我,希望我的回答对你有所帮助。请记得在下方留言,我们一起探讨。我可以给你更多的参考意见。


社会关注聚焦


可能没有足够的动力吧!

如果你学会C语言,别人给你10000块,你会认真学吗?或者你不会C语言,考试不及格 学校就不给你毕业证,你敢不好好弄懂C语言吗?

C语言并不难学,信息时代有很多知识都可以买到,甚至是外国正版书在网站上也是有卖的。还有很多资源都是免费的,比如慕课网,哔哩哔哩,还有一些论坛比如CSDN。

实践出真知,如果仅靠看网课,看相关书籍,你是根本不可能学好C语言的。连编写C语言的软件都不去使用,连代码都没有敲过,连最简单的程序都看不懂,何谈学习C语言。

事实上,就算是大学老师授课,也不是手把手教的,师傅领进门修行在个人,碰到不会的很正常,不必感到懊恼失意甚至想放弃。我们老师也只是讲PPT,给我们演示,然后讲完一章就布置作业 。第一次作业,简直兵荒马乱。很多人连如何命名都不会,打开软件就蒙B,😓。然后就问我怎么搞啊?我……😓虽然我学习是不错,你们很相信我,但是我哪知道啊?我也是新手,大家都一样啊。

没办法,打开手机,输入,如何……,搜索。

奥,找到了,就照着操作呗!

另外,想出类拔萃,你多练习练习打程序,提高手速,能够盲打最好。经过练习,虽然我目前还不能盲打,但是比起刚开始的手指僵硬,现在确实是能称得上灵活了。

奥,还有一点,不会就问,没人能回答就百度,不弄懂你就永远不会 。不要忘记:千里之堤,溃于蚁穴!


和小九一起走进科技


不是不会而是给你一支笔,一张纸,然后再给你一大墨水,然后他说一句:你帮我把我画进入!

具体怎么画这是你的技术逻辑问题了。

不管任何编程软件,它们的核心都是不变的,为工作便捷我们需要建模,比如我制作和3D编程器为了有效模拟3D效果,然后与C结合一起就叫3D编程器,它也是个编程软件也是工具,它不只过是穿有铠甲的勇士而已,脱掉铠甲还不是C吗?建模意思就是模具。

编程器演变过程都是为了工作效率:

这得从芯片制造开始,芯片要设置逻辑指令,开始时候都是一片空白,什么都没有,然后设定线路,制定算法,意思就是指令,有了指令我们才可以写程序代码,那么里面的指令由一一些晶体布局形成,我要让CPU认识0和1,那么如何设置呢?所以用到八进制,八矩阵,摆成01,那么0就代表着点亮八展灯,然后它们在转成波形,那么0占四个点,那么波形上面显示出正玄波,当然由于每个厂商设计不一样,波形宽度不同,因为他们所布置的内存不同有的它从右顶边为一点,中间为1点,这个是制造芯片过程随便设计的,为的是防盗技术,我拿图给你制造你也不知道什么意思。

那么计算机终于识别0101了,那么CPU内部设定,0等于一个灯亮,1等于一个灯灭。两种属于间接法计算。当你输入0的时候CPU就知道0是要点亮一个灯,那你要放入不同的位置设定区域,你会用到0*00001+001100位置,后面还有设定区域,在0*11011到0*11001空间,这个和分区一样的,这就是机器码编写。

演变汇编16进制码,汇编是由机器码编写出来的模具,后面地址不在是01000,它改变成01AF81等等,然后用16进制 AF 01 08 09为代表,有的是01 01 01 01 01 BB为一组代表,它们的和或乘除法在转换二进制,所以汇编指令由左移右移等指令,还有溢出等等。

高级语言C之类语法,属于公式类型计算,是由汇编编写出来的模具计算,公式计算速度更快,直接A+B=C C-B=A 就可以了,然后设置个空白区域画个图上去,A=这个图等等表达方式,你为了更高级快速的完成工作你还要建模,也就是我们的应用软件,随便写什么都可以。

所以编程软件有很多种正常,但它们核心都是C变汇编,变机器码,变电信号改变波形长度。每个编程器它们都有指定的工作效率高低,所以每个厂商采购的芯片都用不同的指令,编程方式也有改动,有的直接不支持汇编那么你的C就用不了,有的还0101都无法编程他们用+-为高低电平,那也没有办法是不是。

但是计算方式都是相同的!


与自然做斗争


工作量大吧,

不过想想有不大的编程语言吗?

归根到底还是,它难以深度学习理解!


因为他们把学习C语言和学习低级编程混为一谈。

学习如何真正利用C语言是非常困难。要做到这一点,你必须很好地了解现代CPU的工作原理。

例如你要知道一些程序集,知道内存是如何布置的以及堆栈和堆栈是如何工作的,您应该了解内存分配是如何工作的以及如何手动管理您拥有的内存。

而且最重要的是,你也必须知道一堆C语言或者根本不公开的东西,或者是间接暴露的东西(常规性BUG)。您必须了解缓存层次结构以及如何读取内存。

你必须了解操作系统是如何工作的。您必须了解像SIMD这样的特殊指令集。

所以理解这大部分知识实际上就是正确学习C语言了。

C语言只是一个工具,你也可以使用其他语言的大部分知识,或者直接编写程序集,或者通过生成LLVM字节码,或者通过设计用于低层计算的DSL来实现...

所以如果用C语言编程,那么你就必须了解底层的编程过程,否则用C语言是没有意义的。

拥有更简单的基础,才能构建更复杂的事物!


分享到:


相關文章: