理解C语言——从小菜到大神的晋级之路(1)——引言:C语言的前世今生

第一课的视频链接点这里

C语言是现在应用最为广泛的编程语言之一,也是现在依然流行的编程语言中历史最悠久的一种之一。在目前业界广泛使用的编程语言中,许多 种语言是以C为基础发展而来。在多类大学的工程类专业尤其是信息类专业的教学计划中,C语言也是极为重要的基础课之一。 而对于一名以编译型语言为主要开发工具的程序员来说,熟练掌握C语言的用法和理论也可以对其他编程语言获得更深的理解。因此,在这一系列教程中我们希望可以深入理解C语言的方方面面,为后续理解更高级的技术奠定更好的基础。

1、参考资料

《C程序设计语言》 Brian W.Kernighan(布莱恩·克尼汉),[美] Dennis M.Ritchie(丹尼斯·里奇)

该书作者Ritchie为C语言的最初设计者之一,Kernighan也是贝尔实验室的高级研究员,C和Unix设计的参与者。这本书作为最经典的C语言书籍之一,其篇幅却短小精悍总共只有两百多页,这得益于作者对C语言无与伦比的深入理解以及简洁精悍的文笔和语言组织能力。多年以来被许多程序员奉为首选参考书籍。

《深入理解计算机系统》Randal E. Bryant,David R.O Hallaren

该书并非直接讲述C语言方面的内容,但是从另一个角度阐述了计算机系统的本质,代码如何影响程序的功能和性能,以及计算机系统的方方面面的深层原理。这本书也因此成为多所世界著名大学的CS专业的指定教材,对于希望晋级为高级程序员的开发者来说也是强有力的助推器。
其他参考书籍:

C Primer Plus

C语言经典教程之一,讲述了C语言大量的细节来深刻诠释概念。条理清晰,易于入门,唯一的缺陷是太厚……

 POINTERS ON C

对指针这一C语言中最重要的概念提供了深入的讨论

《C Traps and Pitfalls》

从词法分析、语法语义、连接、库函数、预处理器、可移植性缺陷等几个方面分析了C编程中可能遇到的问题,适合初学者获取进一步的编程经验,在编程能力上获得进阶

Expert C Programming Deep C Secrets

当对C编程有了一定经验后,可以对进一步提高水平

《Compilers:Principle,Techniques and Tools》和《汇编语言》

对C语言和其他语言理解的终极目标和最高水平是对其汇编和编译的每一个细节了如指掌。达到这个程度,此时便可以称作“精通”和“专家”了。

2、C语言的诞生

C语言诞生的摇篮位于AT&T公司设立的贝尔实验室。AT&T是由著名的亚历山大 · 贝尔与1887年建立的,他在一年前获得有线电话的发明专利。经过多年的发展,AT&T的电话业务逐渐从纽约扩展到美国中部再到美国全国,随后又扩展到欧洲。

AT&T大楼

1925年,AT&T成立了公司的贝尔实验室作为公司的研发机构。由于处于电信业垄断地位的AT&T每年将营业额固定的3%作为研发经费,贝尔实验室的诸多衣食无忧的科学家们在基础科学、通信科学和计算机科学等领域硕果累累,多次获得诺贝尔奖和图灵奖。其中著名的有射电望远镜、半导体晶体管、程控数字交换机、太阳能电池、信息论、C语言和Unix操作系统等,产生了丹尼斯·里奇、肯·汤普森、香农、肖克利等彪炳史册的著名科学家。

贝尔实验室外景

到了1984年,受制于反垄断法,AT&T不得不进行了自我分裂,将市话业务独立为包括西南贝尔公司(SBC)在内的七个小贝尔公司。然而这不是最后一次,到了1995年,为了促进通信设施销售的增长,AT&T一分为三,其中最重要的是将通信设施销售公司朗讯拆分独立上市。然而犹豫2000年互联网泡沫的破裂,大量通信设施销售额变为了坏账,使得朗讯元气大伤。后来,已经日薄西山的朗讯居然再次杀鸡取卵,将无线设备部门再次拆分上市,至此朗讯彻底崩溃,直到最终被法国阿尔卡特收购,变为阿尔卡特·朗讯。值得一提的是在我国国内市场上,该公司依然在积极开展业务,而且有着比较高的知名度,即上海贝尔-阿尔卡特-朗讯。

而与此同时,母公司AT&T也做了同样作死的事,将AT&T无线业务再次拆分上市,此后AT&T也失去了在新时代电信行业的竞争力,直到后来被西南贝尔公司SBC收购。在这几轮拆分中,贝尔实验室先是被划归朗讯旗下,后来由于朗讯已是自身难保,不得不将贝尔实验室的大部分机构关闭,只保留了一个招牌。最终,贝尔实验室随着朗讯被阿尔卡特收购。

虽然贝尔实验室已不复当年的辉煌,但是肯·汤普森和丹尼斯·里奇等人发明的Unix系统和C语言至今依然活跃在计算机与互联网业界。Unix操作系统的最初版本与1971年开发完成,当时该系统还是通过汇编语言实现。后来由于里奇和汤普森认为汇编语言实现操作系统实在太过难以移植,希望通过一种高级语言重新优化Unix系统。最终到了1973年,二人完成了一种新的编程高级语言即C语言,并且很快最新版本的由C语言实现的Unix也问世了。由于远胜过汇编语言的可移植性,C开发的Unix系统对后续的操作系统产生了巨大的影响,其中最著名的就是芬兰人Linus·Torvalds开发的Linux操作系统,这个开源操作系统已经成为现在最流行的操作系统内核之一。由于在这方面的卓越贡献,汤普森和里奇在1983年获得了有“计算机界诺贝尔奖”之称的图灵奖。

肯·汤普森、丹尼斯·里奇和林纳斯·托瓦兹

3、C语言的特点

C语言名义上是一门高级语言,通常可以屏蔽程序对内存、寄存器等物理硬件的操作,在编程时可以专注于实现程序的逻辑功能;但是在需要的时候,C语言依然可以直接对内存地址等物理原件进行操作。自从第三版本的Unix完成以来,C语言到目前也是最适宜做系统开发的编程语言。

相比汇编语言各个指令集所提供的无数种指令,C语言的语法更加精炼。C语言共计提供了39个关键字、9种控制语句、34种运算符。将这些资源合理灵活运用可以实现极为强大的功能,并且不会显著增加程序员的工作负担。

另外,C语言提供了多种强大的数据类型,有整型、实型、字符型、数组类型、指针类型、结构体类型、共用体类型,以及C语言提出的最重要的感念之一——指针等。通过这些数据类型可以实现多种复杂的数据结构,且不会过分影响性能。据测算,通常C语言的编译程序的效率只比汇编程序低不足20%。

作为一种结构式语言,C语言的另一显著特点是代码及数据的分隔化,即程序的各个部分除了必要的信息交流外彼此独立。这种结构化方式可使程序层次清晰,便于使用、维护以及调试。C语言是以函数形式提供给用户的,这些函数可方便的调用,并具有多种循环、条件语句控制程序流向,从而使程序完全结构化。 语法限制不太严格,程序设计自由度大。

4、C语言是否已经过时?一定要学C语言么?

自从C语言诞生之日,至今已有40多年。这么多年里,伴随着新的开发领域和新的业务需求的不断涌现,各种不同的编程语言也是层出不穷。那么今时今日,作为高级编程语言中祖爷爷级的“人物”,C语言是否已经过时?是否还值得现在的学生和新手程序员花大力气去研究呢?如果值得,是不是每个人都应该去学习这门语言?这都是值得思考的问题。

现在,我们看看招聘网站上招聘程序员的需求,满眼都是“iOS”、“Android”、“云计算”、“大数据”、“异构开发”、“数据挖掘”、“分布式系统”等等一堆高大上的名词,现在只会C语言,的确在找工作的过程中缺乏很大的灵活性和选择空间。但是这并不代表着C语言已经过时。从TIOBE编程语言排行榜的榜单上可以看出,经过了这么多年,C语言依然牢牢占据榜单前两位的位置,甚至曾经多次冲到榜首。其操作低层设备的能力、对bit进行操作的能力是大多数高级语言所不具备的,因此C语言在嵌入式开发等领域始终占据不可撼动的统治地位;另外,由于相对于其他高级语言,C语言显得更加贴近硬件,且效率更高,因此也是系统级编程的不二选择。

2015年11月TOBIE编程语言排行榜

那么是否每个程序员都必须要学C?其实也不尽然。对于网站、前端开发,PHP开发,HTML+CSS+JavaScript以及其他一些以解释型语言为主要开发工具,以及其他一些对底层、系统原理要求不高的程序员来说,C语言不是必选项。而对于底层开发(如驱动)、嵌入式开发、Windows开发,以及其他以编译型语言(如C/C++/C#/Objective-C)为主要开发工具的程序员来说,不熟悉C语言必然会对后面的学习造成极大的困难。我们可以肯定的是,对于每个软件工程师,将C语言学至“精通”的程度都是有百利而无一害的。

5、如何学好C语言?

  1. 选择合适的参考书。其实对于大部分编程技术来说,最好的办法是直接从又一个实战项目开始着手,边做边学。但是对于C语言这样比较基础,而又有必要学至精通的技术,找一本靠谱的参考书还是很重要的,这样可以保证知识体系的连续性和完整性,在后期学习更加高级的技术时可以奠定较好的基础。
  2. 多看代码,多敲代码。“纸上得来终觉浅,绝知此事要躬行”。作为一门编程语言,只是看书不亲自去写程序,想学好C语言是万万不可能的。想要深入理解,务必要亲自动手去写足够多的C代码,并且最好可以养成单步调试运行的习惯。
  3. 理解数据结构和算法理论。C语言只是一种工具,如果单纯只是学习这门语言那么不但个人竞争力是非常孱弱的,而且对语言的理解也不会很深入。只有深入理解了数据结构和算法理论之后,C语言才有机会真正实现它的强大功能。也就是说,编程语言只是程序的肉体,算法和数据结构才是程序的灵魂。
  4. 理解汇编语言和编译原理。作为一种高级语言,C语言是需要编译过后才能运行的。希望真正理解C的精髓,需要明白C语言是如何编译称为汇编语言,汇编语言又是如何操作计算机硬件的。只有理解了汇编和编译原理,才能打通高级语言和低级语言、程序与硬件之间的两堵墙,真正掌握程序开发的灵魂。
  5. 研究C语言开发的开源工程。各种各样的开源工程可以说是编程语言的终极应用,如果可以熟悉几个比较著名的开源工程甚至参与其中的话,那么就可谓达到炉火纯青的境界了。
  6. 应用,使用学会的C语言进行更高级的开发,如桌面客户端、服务器程序、网络应用等。在可以将业务需求理解转换为技术需求,并且将其实现出来,且没有bug,此时便已经达到了集大成的境界,完全可以依此去找一份软件开发工程师的工作了,而且基本可以保证十分称职。

综上所述,我们知道,C语言其实比较容易入门,但是如果希望学成专家并将其在技术开发中融会贯通,其实是难上加难。所以在学习的过程中我们需要耐心、专注、意志,不为暂时的困难所吓倒,勇敢地解决掉问题,相信每个有志者都可以成为专家级的人才。

时间: 2024-10-31 08:21:54

理解C语言——从小菜到大神的晋级之路(1)——引言:C语言的前世今生的相关文章

理解C语言——从小菜到大神的晋级之路(3)——C源程序的基本结构与调试方法

    本期视频点击这里        在上一篇中,我们进行了Visual Studio 2013的安装以及第一个demo程序"HelloWorld"的建立.现在我们看一下其中的源代码及相关的C语言基础知识.打开工程,可以通过在源文件标签栏的右键菜单中快速打开源代码的所在目录.HelloWorld的简单代码: #include <stdio.h> int main() { printf ( "Hello World! \n" ); return 0 ;

理解C语言——从小菜到大神的晋级之路(6)——函数与调用

        视频观看:点击这里         在前面的程序中,由于程序的功能非常简单,所有的代码都在main()函数中实现.如果程序复杂度增加之后,在main()中实现所有代码将显得非常臃肿且缺乏条理.如果可以将一段大的计算任务分解为若干个小任务则可以有效解决这个问题.另外,分解出来的模块还可以进一步构造和重用,而不用每次都编写同样的代码.因此,绝大部分实际的C程序都是由一个简单的主函数和多个规模不同的子函数构成,而不是全部实现在一个很大的main函数中. 1.函数调用简介        

理解C语言——从小菜到大神的晋级之路(9)——多维数组

本节视频链接:点击这里 1.多维数组的定义和结构         一个数组中可以支持各种数据类型,那么一个数组中的每一个元素同样也可以是一个数组.对于上次提到的一维数组,其每个元素都是一个简单数据类型的对象,其结构如同一个一维的数据排列:对于一个二维数组,它的每一个元素都是一个一维数组,其形式如同一个二维的表格,表格的宽度是其中作为数据元素的一维数组的长度,高度是这样的一维数组的个数.简而言之,二维数组的结构是一个矩阵的形式.         例如,我们声明下面这样的一个二维数组: int nM

理解C语言——从小菜到大神的晋级之路(2)——开发环境的选择和HelloWorld程序

视频观看:点击这里 一.常用系统及IDE简介        常言道,工欲善其事必先利其器.除了少数奇葩之外,大部分人应不会去使用记事本或者Word文档去编程吧?几乎所有编程语言都需要一个高效易用的开发环境,C语言也不例外.那么该如何选择C语言开发的环境呢?一个编程开发环境需要考虑操作系统和编译器两部分.个人PC上常用的操作系统和编译器主要有以下几种: 1.Windows        在PC市场上,Windows操作系统一直占据着超过9成的比例.自从20多年前的Windows 3.x逐渐成熟以来

理解C语言——从小菜到大神的晋级之路(10)——结构体、联合体

本节视频链接:点击这里         上篇中讲述的数组是复合数据类型中最简单的一种,一个数组使用一段连续的内存保存了若干个类型相同的数据元素.由于类型和长度相同,数组的每个元素通过数组下标和指针变量访问.如果我们希望一个结构保存多个不同类型的数据元素,那么数组将无能为力.为了实现这样的功能,C语言提供了结构体和联合体. 1.结构体基本概念 (1)结构体的定义         假设我们需要定义一个图形中的点的概念.在一个使用笛卡尔坐标系表示图像的系统中,点的位置使用两个坐标分量表示,即横坐标x和

理解C语言——从小菜到大神的晋级之路(15)——完结篇:C编程风格

本期视频链接:点击这里 有人说过:"程序源代码其实是跟人阅读的,只是恰好机器可以编译而已".编程初学者常常会有这样一个观念,就是我的程序只要编译通过了,运行没有问题那就万事大吉了.至于代码的编写规不规范,完全就是无关紧要的小事情.如果是处于学习阶段,比如为了完成在学校的C语言课的作业,那么花心思在代码规范上的确没有特别的必要,因为这些代码基本不会进入实用工程,也不会被很多人阅读到. 但是,如果应用到了工程领域,比如在软件/互联网企业的技术研发部门,或者Github等平台上的开源工程,那

理解C语言——从小菜到大神的晋级之路(8)——数组、指针和字符串

       本期视频点击这里        在前面几次我们接触的数据类型都是简单数据类型,使用一个数据个体表示一个元素.C语言中还提供了多种复杂数据类型,其中最简单的一种就是数组.数组这一结构使用内存中一段连续的内存空间保存一组相同类型的变量,这些变量通过数组的下标/索引的不同相互区分.数组与指针有着十分紧密的联系,通常使用数组下标能实现的操作都可以使用指针完成,而且使用指针的程序通常效率更高.但是指针和数组也存在着一些明显的差别,如果误用将导致错误.另外,C语言中还定义了一种极为常用的特殊的

理解C语言——从小菜到大神的晋级之路(4)——数据类型、运算符和表达式

本期视频点击这里 一.数据类型         对数据进行处理是程序的基本功能之一,因此对于任何编程语言,数据类型都是重要组成部分之一.C语言中定义了较为完善的数据类型体系用于处理不同类型的数据. (1)标识符         C语言中的标识符可以用作变量名.符号名.函数名.文件名等等功能.标识符可以包含字母.数字和下划线(不能以数字开头).C语言是对大小写敏感的语言,因此组成相同但大小写不同的两个标识符将被当作两个不同的标识符处理.         C语言中的标识符可分为三类: 关键字:C语言

理解C语言——从小菜到大神的晋级之路(12)——动态内存管理

      本节视频链接:点击这里         在前面的内容中,我们通常使用数组来利用一段连续的内存空间来保存数据.我们前面用到的数组基本保存在栈内存中,其内存空间由系统自动分配和释放,使用非常方便,也不用担心内存管理的问题.但是在栈中分配的数组存在一个严重的问题,就是它的长度必须在建立时明确指定,且无法再运行时修改.为了防止运行时出现内存空间不够的问题,在编程时就必须定义一个非常大的数组来容纳理论上可能的最多个的元素,这样就会导致内存利用率底下,因为如果元素个数较少时大部分的内存空间都被浪