0%

C Primer Plus学习指北

这篇文章主要讲述了阅读C Primer Plus的方法,以及一些学习C语言时的心得。结合自己半年学编程的经验,希望可以对还没学过C语言的人多多少少有一些帮助。

先谈谈一些其它的问题

为什么要学C语言

知乎上有个答主这样调侃机械工程专业为什么要学C语言这个问题

学机不学电,艹铁一万遍;
学电不学编,屁也搞不颠。

下面我从一个初学编程者的角度分析一下:

  1. 传统的机械行业已经式微
    在看新闻联播时,我们经常听到“优化产业结构、加快产业转型升级”之类的话。下面是一篇新闻对产业转型升级的定义:

    产业转型升级不是不要低端产业、劳动密集型产业,更不能再对这些产业进行简单、粗放式经营和管理,要将这些产业做精细了、做专业了。
    而做精细、做专业的途径之一便是自动化、智能化。一些几千平米,甚至几万平米的智能车间,你连人影都看不到,只听得到机器单调的嗡嗡声。那可能你会说,控制机器有必要学编程吗?像用word、ppt那样,用别人的软件不就行了吗?实际上工业软件十分昂贵,后续还有软件维护等费用,小公司不一定承担得起,而且有些时候我们需要针对特定的需求去制定软件,别人的用起来可能不怎么顺手。(这里跑题了,工业软件可能不是机械专业学生的菜,估计我们学校的力学-软件工程跨学科交叉专业实验班才是专门研究这个的。)因此,为了进入更高端的行业,掌握一项编程技能是必要的。

  2. C语言足够“底层”
    要让机器动起来,就先要和它交流。C语言提供了强有力的工具——指针,来帮助我们与机器交流。很多其它语言(如python、Java等)并没有指针,只有引用,限制了程序员对程序的掌控能力。
  3. C语言入门比较简单
    • 你可能听说过汇编,我也仅仅是接触过一点点,就笼统地谈一下吧。汇编比C还要底层,运行效率一般也比C要好。但仅仅入门汇编就需要计算机系统、计算机组成原理等专业知识,实在是劝退。而且用汇编写程序,机器当然跑得很爽,人可能己经累摊在地上了。
    • 至于C++,我听过的说法是,C++并不适合初学者,有很多抽象和封装,语法和语言特性太过复杂,我就没敢去碰了。
  4. 编程的思想是一致的
    就我在网络上观察,从来没接触过编程的人常常会纠结于学哪门语言好。实际上编程语言都是有共性的,掌握一门语言后,学习另一门语言的时间会大大减少。

我为什么建议自学

我们学校有开C语言的课程,我也在上,但对于我来说,效果可能不是那么理想。

  1. 有时候老师会讲解一些奇奇怪怪的代码(比如i = i++ + ++i),但我们大多数都不会去写编译器,这些代码点反而会把学生搞糊涂。作业、考试的题目也有些“畸形”,平常写代码不会涉及到。
  2. 编程终究还是一项实践的活动,我更喜欢自由掌握时间,按照看书->写代码->出错->问搜索引擎的顺序学习。而课堂上教的东西实在是有限,不能满足我们实际的需要。

C Primer Plus

C Primer Plus常常出现在各种拉人入坑的帖子的书单中。它的优点在于足够详细,且通俗易懂。然而读一本700多页的专业书可不容易,就算当小说看也够呛。我第一次读这本书时简直震惊了,这作者怎么这么能讲。相比较之下,被誉为C语言圣经的The C Programming Language的英文版只有不到300页。但后者由于跳跃的思维(本身也是给程序员写的),并不适合入门。C Primer Plus有非常详细的代码和注释,每一章后面都有练习题,对新人更加友好。

说了这么多,我并没有通读这本书。我第一次读的想法只有:他怎么这么能讲,他怎么还没讲完,我还要多久才能到下一章?还有一个时不时萌生的念头:我学这些琐碎的东西干什么?当时的我没有掌握读这本书的方法,陷入了自我怀疑的泥潭。我写这篇文章的初衷就是想帮到那些与我有相似想法的人,下面就是具体的阅读方法和我的一些心得体会。

前言和目录

实际上作者已经在前言中告诉了我们阅读方法(由于版权原因这里就不写出来了),这些方法避免了太过详细的内容反而把重点淹没的情况,而目录则是了解整本书结构的很好的方式。

示例

书中有非常多的代码示例。刚开始学习时,你可以一边把示例敲上去,一边分析这样写的原因,并看一看结果是否符合你的预期。不需要过度关注一些细节,大方向是正确的就行了。到了后期,手抄代码会变成无聊且令人沮丧的事,这时你可以从书中的网址下载源代码。但比较好的做法是,思考后再执行。

课后练习题

刚开始时,做一些练习题是必要的,尤其是编程练习。但到后来你可能发现,题目有些多得离谱了,你也开始产生厌烦情绪。这就要求我们筛选出同类型的编程题,并略过。

刷题

什么?还要做题?别慌,这些题没这么难,而且对帮助熟悉C语言大有好处。题目的形式主要是这样的:给出问题->要求你写一段代码解决->提交代码->通过(AC)或出错(WA),你唯一要做的就是写代码解决问题并不断该错,验证答案什么的交给OJ(online judge)就行了。我推荐这个刷题平台PTA中的Basic Level Practice,只要学会基本C语言的用法就可以开始愉快的刷题旅程了。

笔记

虽然编程是一门实践的课程(大概),但我们仍然要记笔记,以免。但在编程中,笔记可以以注释的形式记在代码中(注释就是一段话,给人看的,不会被执行)。同时,养成写注释的习惯,习得良好的注释风格可以帮助我们更好地复习(否则你连自己一个星期前的代码都搞不懂)。

查阅资料

初学时,我最喜欢用百度,哗的一下,一堆结果就出来了(当然还有很多广告)。但随着我们的深入学习,你会发现百度到的东西很多都不靠谱。我推荐Google和StackOverFlow作为进阶学习的资料来源,但两个网站都需要一些正确的姿势才能进入。还有一点,官方的文档通常是最权威的资料,在里面我们可以阅读最详细的解释。

讲解

我不喜欢将别人已经说清楚的东西再复述一遍,因此不会进行讲解。这样虽然可能可以锻炼我的写作能力,但对读者来说就是灾难。第一手的资料大多数时候都是最好的。像那些没有新意的博客,一篇文章转发来转发去,每一次转发都可能导致原作者的想法被魔改,还可能在某一次转发时,原作的链接都找不到了。


后记

其它编程语言

Python和Matlab也是机械专业学生可能用到的工具,但我了解不多,在这里就不谈了。

感受

我也是一个初学者。初学者和初学者交谈可能讨论不出什么高大上的东西出来,但总是能互相理解的。有些编程高手、老师都受到了所谓“知识的诅咒“,很难理解初学者这也不会那也不会的情况。

然后呢?

在对C语言有足够的了解后,你一定会产生更多的疑问,下面是一些我身边的人推荐的路线,仅作参考(因为我不懂)

  1. 向下走:单片机、计算机组成原理、操作系统、数据结构与算法、计算机网络等。(我都不懂)
  2. 向上走:Python、C++等面向对象的语言等。(我也不懂)
  3. 转入俗称万物起源的计算机专业,直接走向人生巅峰(滑稽)。

感谢浏览!