思前想后,还是把写的这本书直接发到公众号上。
这是一本C语言的入门书,用去了我2018年的整个冬天。作为一个在学习C的征途中踩坑无数的人,这让我不禁想起学习C的一路艰辛。
这本书用作者本人喜欢的逻辑方式,去描述了C语言的一些基本概念,最为关键的是,结合linux操作系统去描述,这样一些概念会更清晰。从而使入门的难度进一步降低。
虽然能够熟练的使用C,也对C中的概念、设计思想有所了解,但在C语言面前,我依然是一个小学生。无论何时,请保持一个谦虚、奋进的态度,这是你前进的根本。
本书的写成与发布,无关荣誉,无关利益,只是想让那些与我有过同样迷惑的人,拨云见日。如果你觉得好,就转发给你身边需要的朋友,这就是我们能得到的最大快乐。
书中的写作难免有错,如果有误,或者理解不对的地方,请直接与作者本人联系taxuxiang@buaa.edu.cn 或添加本人微信ta1969。由作者本人修改后,再次发布。
注:大家可以转载,但请不要用来谋利。多谢
作者简介:
他旭翔,男,1990年,博士生,现就读于北京航空航天大学计算机学院网络空间安全专业,主要研究方向为物联网安全、人工智能。
序 言
大浪淘沙,时光飞逝。计算机、互联网深刻地改变了我们的世界。剥开迷雾,隐藏在这些神奇技术背后的是一串串01代码,这些代码如同跳动的音符,在演奏美妙的旋律,又如同让人迷惑不解的星空,闪烁着诱人的光芒。
看到这些纷繁的技术,我们不禁会问,这是怎么实现的呢?曾几何时,作者本人也是如此好奇,好奇计算机能按人的想法去工作,好奇各种软件,好奇各种网络攻击与计算机病毒。在随后的学习中,有幸接触了计算机,便一发不可收,开始抱着技术书籍啃起来。这个过程,充满了艰辛,更充满了快乐,人不就是这样吗?为了喜欢的事情而活着,虽百死而无憾。
作者深信,一本好书,能够让人无比舒畅。在自学计算机知识的过程中,我踩过很多地雷,迷惑了很久,查找过很多资料,这是一个艰辛的过程。为此,我想让那些想自学计算机编程知识的人不要再走我的坑,便酝酿了这本书,本书的目标,就是为大家自学C语言提供足够的背景,足够清晰的理解。书中有我的心得,更有教训,希望大家读完这本书,能够在学习C,学习编程的道路上走得更坚实。
谨以此书,致敬封面的两个伟人,左Dennis Ritchie,C语言的发明人、UNIX的合作者,右Ken Thompson,UNIX的主要发明人。二位前辈都是图灵奖的获得者。怀念他们,他们的贡献,是一个划时代的开端。
第一章 信 仰
坚韧的喜欢一件事,在时间的积淀中去全力以赴,这就是信仰。本章中,我将向大家主要阐述四个问题:
(1)C语言是什么?
(2)C能做什么?
(3)怎么学C?
(4)用什么样的工具?
作者本人从2009年开始了解C语言,在随后的这10年中,只用C,从懵懂到提高,再到熟练,经历了一个相当长的过程。我总是觉得,别人几个月学会的东西,我总是需要一年,或者几年,真的是自己的悟性太差吗?想了好久,好像并不是这样。我说上面这句话的意思有两个:第一,在时间的长河中,一个好的认识方式,会让你少走很多弯路;第二,大部分人,找到合适自己的路,需要经历多次的摸爬滚打。能够熟练的运用C,我用了10年,相信你,一定会比我强。
闲话少言,现在就来解决我们前面三个问题里的第一个。
一、C语言是什么?
在计算机发展的早期,计算机主机是非常庞大、非常昂贵的。庞大到什么地步呢?光一个主机就占了好几间屋子,并不是现在那种台式主机,一个小机箱放在自己的桌子旁边就行。昂贵到什么程度呢?最早期的计算机,一个学校能买的起一台就不错了,你还以为是现在那样几千块钱一台吗?NO。
等待是最痛苦的事,但又是必须经历的事。由于当时计算机并不具备相对高级的语言,只能用机器语言或者汇编语言来写程序。这样的程序是相当繁琐易错的,计算机科研者工作花费了大量的时间用于检查程序的错误,这是相当费时的。由此,大家迫切需要一种接近人类做事方式、层次的语言来实现编程,C由此而生。
在上世纪的70年代,Dos还没有诞生,Linux也远未出世,贝尔实验室的Ken Thompson利用假期时间,借助汇编语言,写出了最原始的UNIX内核(即操作系统最核心的部分)。随后,同是贝尔实验室的同事Dennis Ritchie,发明了C语言,一种靠近人类做事方式的新语言,重写了UNIX的内核。至此C语言开始蓬勃发展。
啰嗦了这么多背景,其实,核心内容总结起来的目标就是理解C语言的诞生过程,以及它的最大特征。C语言是一种能够以接近人类做事方式去编程的语言。如何理解它接近人类做事方式呢?主要是因为它的过程化编程思想与人类做事的方式相似。
在知道了这些之后,我们就会问,现在的社会,已经有了相当多的语言,如C++ ,java, python等,为什么还要学C呢?它已经很古老了。
在此我想纠正一种想法,请记住:最新的不一定是最好的,也不一定是最适合你的。每种工具都有它的使用范围,在这个范围内,它无与伦比,出了这个范围,它一无是处。用古人的话来说就是“干什么活,用什么家伙”。
既然我想带大家学C,那么,我必须要客观的来介绍C。
把一件事,做到极致,你就是神!
在我看来,学C不仅仅是学一门语言,更是学一种理念。这种理念从C诞生之日起就一直存在,如同于C语言的灵魂并广泛为人所接受,这个理念就是简洁、直接、高效。正是上面的这三个特点,让爱C的人沉迷不可自拔,让恨C的人望而却步。C是简洁的,简洁到只用四十几个关键字就描述了一切;C是直接的,直接到你可以查看你想要的一切;C是高效的,高效到可以与汇编效率相当。在近50年的工业考验中,大浪淘沙,C依然屹立,这就足以说明C的威力。
二、C能做什么?
曾经看到一个段子,“C对python说,来,兄弟你写个内核装载器我看看,python默默无语,C又对java说,来,哥们你用30行不带库的代码实现个底层网络连接,java泪流满面。”在此没有贬低python与java的意思,只是想告诉大家,C的最大优势在于偏底层、对效率要求高的地方。在接近硬件编程的层次,比如内核、驱动,C无与伦比,而在市场招聘方面,这两方面职员的薪资也较高,同样学习的时间也较久,需要深厚的内力。有人会问,学了C就只能留在底层吗?错,C可以做应用层编程,而且在UNIX的应用层,C的系统调用更为简洁,远比windows的数量庞大来的轻松。
三、该怎么学习C?
知道了用C可以做什么,我们下一个问题就是该怎么学习C了。本人一直觉得,学习一种语言,一定要有一本合手的入门教材。注意,一定是入门教材。作为一个初学者,不要觉得自己是大神,任何的书都能看,学习是一件循序渐进的事,你没有那个功力,内功练的不到位,去盲目的拔高,一定是在折磨自己。
“如果一本书,你越读越想读,越读越舒服,那么恭喜你,这本教材就是适合你的。如果一本书你认真读了依然很吃力,那么,只有两种情况,第一,你的功力达不到这本书的要求,第二,这本书在故弄玄虚”。这个原则,是我一直所坚持的。在学习的每一个阶段,我都用这个原则来选书。我记的在我刚开始学C语言的时候,问一个技术比较牛的人,应该用什么样的书?他不假思索的跟我说《C程序设计语言》,作者:Dennis M. Ritchie,这是C语言的发明者写的。于是,我兴冲冲的跑去把这本书买回来,准备大干特干一番,读了两天,结果就不想读了,我个人认为,这本书,根本不是给入门学者读的,而是给已经有了适当基础的人。打个比方,你觉得让一个对C一无所知的人直接用指针,合适吗?于是,我果断将这本书收起来,去找合适我初级水平的书,但是很可惜,没有找到,只能按着各种教材去学,这个过程,很痛苦,主要是因为有很多背景概念并没有介绍,而这些基础的背景概念,对理解C语言有着至关重要的作用。我自认为悟性不高,所以我是真的需要一本真正的入门教材,这本教材里,该讲的背景知识要讲到,该描述的细节概念要描述清楚。所以,这也是我写这本书的目的,只想尽我所能给那些想认真学习C语言的人铺一条路。请放心,如果你觉得读我的这本书依然很吃力,那么,只能证明,我这本书写的很烂,而不是你的悟性很差。
四、用什么样的工具来学C?
我想说明最后的一个问题,“用什么样的工具来学习C语言?”,对于一个入门学者,你所使用的工具,一定是能真正的帮你去理解C语言或者方便你使用C语言,基于这个考虑,我们必须要用UNIX/Linux,说到这里,会引起一个老生常谈的争论,那就是为什么不用windows?在我个人看来, windows毫无疑问是一个优秀的桌面系统,这样的优秀,是以掩盖大量的底层细节为代价的,作为一个普通的家庭用户,它是绝对合适的,但是作为一个学习C语言编程的人,这种大量被掩盖的底层细节,是学习路上真正的绊脚石,比如,在windows下,初学者永远理解不了什么是“流”,什么是“EOF”,也永远弄不懂库函数与系统调用的区别,更永远也理解不了“一切皆文件的经典理念”,这些概念,如果在UNIX/Linux下,那是简直就是信手拈来。
大家可能会问,为什么在UNIX/Linux下这么容易理解呢?那是因为C语言本来就是伴随着UNIX而生的,还记的前面讲的用C重写UNIX内核吗?C语言在哲学理念上与UNIX有相当大一部分是共通的,本来C就是为了写UNIX而生的,C中的许多概念,就是UNIX的影子(请允许我这么打比方)。在学完C语言以后,你还会学UNIX系统编程,还会学socket编程,或者学shell脚本,那个时候你会体会到,基于UNIX/Linux平台的它们,理念如此的统一,也正是这种统一,让UNIX/Linux的程序员们较为轻松一些。历经50年而不变,这就是UNIX/Linux与C的力量之处。毕竟,相对永恒的东西,才是经典。
在此,我需要简单阐述一下UNIX与Linux,Linux是因为前期UNIX的授权问题而诞生的,Linux延续了UNIX的一些设计理念、编程接口API(application program interface,通俗的讲,就是一些彼此商量好的函数原型、常量)以及命令使用上是高度一致的,都遵循POSIX标准。所以,在Linux下会编程,在UNIX下也不在话下,甚至代码都不用改,重新编译就可以直接运行。
说了这么多,是时候将我们要用到的工具扔出来的时候了,那就是:
Linux操作系统(linux mint)
Vim编辑器
gdb调试器,gcc编译器
这个linux mint是什么意思?
这是Linux操作系统的一个发行版,现在市面上有很多种linux的发行版,所谓的发行版,就是一些厂商或者组织,将Linux内核与一些系统工具组合起来,不同的厂商可能选择不同版本的内核(不同版本功能不一样),也可能组合不同的系统工具,因此就形成了各种各样的发行版,我们选择mint是因为它在易用与稳定之间做了一个较好的权衡。
说到这里,又得啰嗦一句,Linux操作系统主要分成两部分,第一部分是Linux内核,这部分是整个操作系统的核心,你所实现的所有功能,都必须内核支持,否则就是空想。第二部分是系统工具,就是上一段所说的,在我们用计算机时,总会用到一些工具,比如vim,gdb等,这些工具方便我们来使用计算机。在本书中,我们用术语“linux”来描述“内核+系统工具=发行版”。通常我们所说的linux指的是发行版,而不仅仅是内核,这一点大家请注意。
至于vim、gdb、gcc是什么,在后面用到的时候,我会告诉大家。
总结:本章主要阐述了四个问题,即C语言是什么,为什么要学C语言,以及怎么学C、用什么样的工具去学C,本章最主要的目的,是为大家学习C提供一个清晰的最顶层动机理念,知道我们要干什么事,怎么去干,为什么这么干,希望大家能够明确目标。在进入下一章前,请完成以下习题。
习题
请自行搜索C与UNIX的哲学设计理念,并再次阅读本章内容,然后写出你认为C语言的长处,并全面思考,这些长处是不是你真正喜欢的。
推荐图书:
1、《鸟哥的私房菜》上册,该书通俗易懂的描述了如何使用linux发行版,虽然里面描写的是centos(一个发行版,以极度稳定著称),但是,所有的linux发行版,在命令行使用上都是共通的,所以不必担心与本书的linux mint冲突。这本书,绝对应该放在你的书架上。
来源:https://blog.csdn.net/qq_27728475/article/details/98884295