http://zhuanlan.zhihu.com/linjr/19694823

计算机行业发展非常快,大学里的教育基本都跟不上实际的社会需求。如果你所在的学校还在指定大家使用谭浩强的教材,或使用VC6.0来教大家上机实验,那你不妨看看本文,这里有一些建议可以帮助你不会脱离社会太远。

考虑到这是一个过来人感觉很基础,但是对于初学者又觉得困难重重的问题,我想如果这篇文章要想写得不让你觉得专业名词扎堆,内容高深莫测,读完还是不知所云,那最好的办法也许是,我们通过沟通的方式把整个「C语言应该怎么学」的问题由小及大的展开,慢慢来谈。

在开始之前,我们先来做一个小测试。

一、小测试,你准备好学习C语言了吗?

  1. 你是否听说过二进制数,他们是如何进行运算的?(基本的数的进制知识)
  2. 你能说出一个最小的计算机系统由哪些部分构成吗?(基本的计算机结构知识)
  3. 计算机是如何存储图像的? (数字化原理)

上面这三个问题,能回答的同学举手。如果你举手了,那么我们进入下阶段的讨论,否则,我将告诉你,你现在最重要的事情,是赶紧找一本《计算机科学导论》把预备知识补充好。

因为——

C语言说到底是一门以内存为中心的编程语言,你能不能学懂它,其实很大程度上不是取决于你智商高低,而是你是否拥有扎实的计算机结构、存储、运算原理方面的知识!!

在这里,我想强调,任何新知识的学习都是有一定的前提条件的。C语言学习的前提条件就是,对计算机系统要有一个整体的,科学的基础认识。 脱离了这个基础认识,一切都很困难。

所以,有些同学学不会C语言,不是因为他们智商不行,而是因为他们没有准备好。

我花时间写这篇文章来给大家讲C语言的学习,当然是希望大家真正的学会、学懂C语言,并能够真正感觉到它的用处,所以很抱歉我不会像培训机构那样,告诉你“零基础”就能够开始学。但如果你真的按照我说的去做,那么至少从现在起,你确实是开始有点“学院派”的认真了。

在这篇文章的最后,我推荐了一本我曾经读过的《计算机科学导论》。这本书可以说是我的启蒙书,我读过,真心觉得好,所以推荐给需要的同学。

好了,接下来我们进入C语言的学习过程。

二、学C语言到底学些什么—— 「语法」和「函数库」

C语言学习的关键,是要先搞明白,学C语言到底是在学些什么?

我这么一问,有的同学就要翻开课本,指着目录说,我知道我知道,有变量,数据类型,循环语句,函数,哦哦哦,还有指针等等!

很遗憾,如果你以为学习C语言就是学习这些东西,那你得赶紧纠正一下看法,否则接下来的学习会困难重重。因为我曾经就是这么掉到坑里的,这种狭隘的观点让我浪费了大量的时间去学习琐碎的细节,又让我迟迟不能接触到更重要的知识,结果是眼高手低——知道许多别人不知道的无用知识,但是又写不出什么真正像样的程序来。

所谓「语法」,就是入门教材里最着重讲解的内容。也就是那些所谓的变量、数据类型、分支判断、循环、函数、指针等等。

这些内容比较枯燥,但是好消息是这些内容并不难,都是一些格式化的东西。只要你多练习,就会自动的刻在你的脑子里,成为一种下意识的习惯。

但是 「语法」本身其实没什么用。因为它只是一种格式规范,你学得再好,也不能引导你写出厉害的程序。因为在软件设计中,实际上最核心的部分还是在于其 「函数库」部分。

什么是 「函数库」?

简单来说,函数库就是别人编写好的C函数,直接提供给你用,你只要调用里面的函数,就能实现一定的功能。例如 printf() 函数,你肯定知道,只要调用这个函数,你就能够在那个黑糊糊的窗口里显示一段文字。你并不明白 printf() 的内部工作原理,但是你知道你只要按照说明去调用,就能够实现对应的功能。

这就是函数库——别人写好的,打包送到你面前,你可以自由调用来做各种各样的事情的函数集合。

我来说几个来自函数库的函数,例如 CreateWindowEx() 函数可以用来创建一个窗体(这个函数由微软提供),例如 GaussianBlur() 函数可以用来对一个图像进行高斯模糊处理(这个函数由 OpenCV 提供),再比如 evhttp_new() 函数可以创建一个 HTTP 服务程序(这个函数由 libevent 提供)……

其他还有什么库函数?太多了。从控制网络通信,到截取视频画面并分析其中的人脸位置,到加解密本地文件,甚至包括微信收发消息,抓取淘宝商品信息……库函数的数量和有用程度远远超乎大家的想象。

诶?你从来没听说过还有这些东西?课本里也没提到?

那是因为你看的是入门教材,着重讲解语法,顺带提到了少量的 C 语言自带的库函数而已。事实上 C 语言包含的库函数本身就有不少,但是更多更强大的还是许多第三方库函数,例如我上面提到的这些。

重点是在于,我想告诉你,库函数才是你学习C语言并将其应用于实际的关键!!

学会调用别人的库函数,甚至写出自己的库函数,都是极其重要的。因为一个函数,本质上就是一个功能单位。你拥有的基础设施越多,你的发挥空间越大。道理就是这么简单。这就是我需要向大家强调的第二个观点,要想写出实用的C程序,一大关键就是研究并学会使用各种库函数。

你看见隔壁王二写了个三维程序能让一个彩色的立方体在空中旋转?快找 OpenGL 库函数来用。什么?刘大宝写了个网络软件能在局域网里聊天?快找 Socket 库来用。

看见了吗?库函数有多重要?

但是,函数库的学习并不是孤立的。许多库函数背后需要一定的领域知识支撑。同样如我第一个观点所述,需要预备知识。学懂一个函数库,代表的不仅仅是明白如何调用那么简单, 而更反映了我们对一个特定领域——网络、数字图像、密码学、操作系统等的认识。

三、基本的学习过程与一般规律

如我前面所述,C语言学习主要是以语法入门,然后到函数库。再具体一些来说,包括以下阶段:

  1. 学习基础语法
  2. 学习简单的少数几个C语言自带的函数
  3. 学习一些程序设计的基础知识(数据结构,算法)
  4. 学习更多更强大的C语言自带的函数
  5. 学习一些特定应用领域的基本理论知识(操作系统,数据库,网络,图像……)
  6. 应用上一阶段学习的到知识进一步学习其他人提供的函数库(网络处理、操作系统管理、图像、密码学等等)

对于本科阶段的同学来说,着重学好1-4,有选择的学习一下5-6,做一些小作品出来,就已经非常非常不错了。这就是一般的学习规律。说得很简短,但是要做到真的很不容易。

四、参考书籍

首先第一本,也是我认为最重要的书,是这本《计算机科学导论》。亚马逊地址:《计算机科学导论(原书第2版)》 佛罗赞 (Behrouz A.Forouzan), 莫沙拉夫 (Firouz Mosharraf), 刘艺【摘要 书评 试读】图书

可以说,这本书是对我人生影响最大的两本书之一。这本书通俗易懂,知识面广,但又具有一定的深度。真是因为读了这本书,才让我建立了对计算机科学合理的基本认识。在不涉及太多的数学原理的情况下,这本书清晰的揭示了包括计算机的基本构成,CPU运算的原理,内存、硬盘、光盘是如何存储数据的,编程的基本原理(机器语言、汇编语言,结构化编程语言,面向对象编程语言),以及网络、数据压缩等。

说白了,就是一本科普书。但是是一本伟大的科普书。入门者的福音书。

然后,第二本,就是关于C语言语法的书籍了,说实话这部份我已经没有印象看的什么书了。因为我这个人有个毛病,就是喜欢东翻翻,西翻翻,哪里不懂就到处找书。可见这个部分其实没有大家想象的那么固定,你只要找到一本自己看得懂的书,就是好书!不必太过于拘泥于书与书之间的优劣比较。

最经典的C语言入门书籍许多人肯定要说是 K&R 的那本。但是其实这本书对大多数初学者来说还是略难,如果有兴趣也可以读一读。但我更建议你了解一些C语言之后再转过来看看会更好。

柴田望洋的《明解C语言》最近是一本广受欢迎的亲切的C语言入门书。《明解C语言》 柴田望洋, 管杰, 罗勇【摘要 书评 试读】图书

昨天我专门到书店翻了一下,这本书确实很不错,亲切,谦虚,易懂。但我想也未必适合所有人。如果你是希望学习曲线平缓一些的,可以考虑看看。

啊,差点忘了,还有一本咱们国内的赵岩先生写的《C语言点滴》也有不错的反响,也许大家也可以找来看看。《C语言点滴》 赵岩【摘要 书评 试读】图书

基本上,上面这些书就能帮助你比较轻松的入门了。其他书籍推荐,我会陆续也写出来。今天实在写不了这么多了。

但是,再补充一本,如果对于那些已经学得差不多的同学,必须得看看下面这本,这是我的至爱之一啊!^_^ 那就是吊炸天的《C Standard Library》,china-pub链接:C标准库(C标准库“圣经”)[按需印刷]

好好看看这本书,它是真正的顶级教材,因为——里面包含了标准库实现的完整源码,以及作者在实现时的思路讲解。是一本值得收藏的超级力作。让我们一睹顶级程序员的思维杰作。(吐嘈:这本书的翻译还是有一些值得修正的地方,所以能收英文版的同学就直接收英文版了)

这几本书其实并未涵盖C语言学习的所有重要方面。稍后我会再放上一些来。今天打字打到手疼,就不继续了。

五、晋级——通向更高境界之路

学无止境。更专业的学习至此其实才刚刚开始。

[转载]学习C语言基本思路与参考书籍的更多相关文章

  1. (转)学习C语言基本思路与参考书籍

    计算机行业发展非常快,大学里的教育基本都跟不上实际的社会需求.如果你所在的学校还在指定大家使用谭浩强的教材,或使用VC6.0来教大家上机实验,那你不妨看看本文,这里有一些建议可以帮助你不会脱离社会太远 ...

  2. 漫谈C语言及如何学习C语言

    抄自:http://my.oschina.net/apeng/blog/137911 目录:[ - ] 为什么要学习C语言? C语言学习方法 1,参考书籍 2,动手实验环境搭建 3,网络资源 附录 一 ...

  3. [转贴]漫谈C语言及如何学习C语言

    抄自http://my.oschina.net/apeng/blog/137911,觉得很有用,收藏它 目录:[ - ] 为什么要学习C语言? C语言学习方法 1,参考书籍 2,动手实验环境搭建 3, ...

  4. 系统学习PHP的一些思路

    作为一名新进的PHPer,迫切的想提高自己的编码水平,目前市面上几乎没有高手来给新手指点出一条相对靠谱的途径. 首先,面对PHP众多杂乱无章的各种函数,到底该怎么去理清其各者之间的关系,经过一段时间的 ...

  5. 使用Firebug或chrome-devToolBar深入学习javascript语言核心

    使用Firebug和chrome-devToolBar调试页面样式或脚本是前端开发每天必做之事.这个开发神器到底能给我们带来哪些更神奇的帮助呢?这几天看的一些资料中给了我启发,能不通过Firebug和 ...

  6. 笔记:学习go语言的网络基础库,并尝试搭一个简易Web框架

    在日常的 web 开发中,后端人员常基于现有的 web 框架进行开发.但单纯会用框架总感觉不太踏实,所以有空的时候还是看看这些框架是怎么实现的会比较好,万一要排查问题也快一些. 最近在学习 go 语言 ...

  7. 我想立刻辞职,然后闭关学习编程语言,我给自己3个月时间学习C语言!这样行的通吗

    文章背景,回答提问:我想立刻辞职,然后闭关学习编程语言,我给自己3个月时间学习C语言!这样行的通吗? 我的建议是这样:1. 不要辞职.首先说,你对整个开发没有一个简单的了解,或一个系统的入门学习.换句 ...

  8. JS重要知识点(转载 学习中。。。)

    这里列出了一些JS重要知识点(不全面,但自己感觉很重要).彻底理解并掌握这些知识点,对于每个想要深入学习JS的朋友应该都是必须的. 讲解还是以示例代码搭配注释的形式,这里做个小目录: JS代码预解析原 ...

  9. 学习C++语言的50条忠告

    50条忠告:(其中有几条觉得写的不够贴切,所以删了,发了余下的部分) 1.把C++当成一门新的语言学习: 2.看<Thinking In C++>,不要看<C++变成死相>: ...

随机推荐

  1. UIPickerView的使用

    简介:UIPickerView是一个选择器控件,它比UIDatePicker更加通用,它可以生成单列的选择器,也可生成多列的选择器,而且开发者完全可以自定义选择项的外观,因此用法非常灵活.UIPick ...

  2. C++获取private的变量-偷走private

    private提供了对数据的封装,使得private成员只能被类自身的成员函数以及类的友元访问,其他的函数或者类想要访问private成员只能通过该类所提供的set和get的方法进行访问, 或者返回其 ...

  3. 使用JavascriptExecutor将页面滚动到最底部

    使用如下代码,将页面滚动到最底部 @Test(enabled = true) public void scroll(){ String jsStr="window.scrollTo(0,do ...

  4. json数据进行格式化

    <?php /** Json数据格式化 * @param Mixed $data 数据 * @param String $indent 缩进字符,默认4个空格 * @return JSON */ ...

  5. 关于2013年1月21日的DNS故障分析文章

    首页 资讯 小组 资源 注册 登录       首页 最新文章 业界 开发 IT技术 设计 创业 IT职场 访谈 在国外 经典回顾 更多 > - 导航条 - 首页 最新文章 业界 - Googl ...

  6. DataRow数组根据指定列排序

    正序:DataRow[] datarow = datarow.OrderBy(x=>x["Ybrq"]).ToArray(); 倒序:DataRow[] datarow = ...

  7. properties文件读取与写入

    将peoperties文件的读取和写入封装成了一个工具类: import java.io.BufferedInputStream; import java.io.FileInputStream; im ...

  8. P4254 [JSOI2008]Blue Mary开公司

    题面 这道题的意思就是给出若干个一次函数,当\(x=x_0\)时,最大的\(y\)为多少 这种题可以用李超线段树来处理 什么是李超线段树呢? 李超线段树存储的是在区间上方暴露最多的直线标号,为了便于描 ...

  9. Paint Chain HDU - 3980(sg)

    因为题中是个环, 所以我们可以首先拿出一组m 如果n<m 先手必输 否则的话跑sg函数 n = n-m #include <iostream> #include <cstdio ...

  10. 洛谷 P1053 逛公园 解题报告

    P3953 逛公园 问题描述 策策同学特别喜欢逛公园. 公园可以看成一张\(N\)个点\(M\)条边构成的有向图,且没有自环和重边.其中1号点是公园的入口,\(N\)号点是公园的出口,每条边有一个非负 ...