原文:Introduction: The Cartesian Dream Of Chtml
译者:飞龙python
Whatever I have up till now accepted as most true and assured I have gotten either from the senses or through the senses. But from time to time I have found that the senses deceive, and it is prudent never to trust completely those who have deceived us even once.git
勒内·笛卡尔,《第一哲学沉思录》程序员
若是有一段引述用来描述C语言编程的话,那就是它了。对于大多数程序员,C是极其可怕并且邪恶的。他就像是恶魔、撒旦,或者一个使用指针的花言巧语和对机器的直接访问来破坏你生产力的骗子洛基。因而,一旦这位计算界的路西法将你缠住,他就会使用邪恶的“段错误”来毁掉你的世界,而且揭露出与你交易中的骗局而嘲笑你。github
然而,C并不该因为这些现实而受到责备。你的电脑和控制它的操做系统才是真正的骗子,而不是朋友。它们经过密谋来向你隐藏它们的真实执行逻辑,使你永远都不真正知道背后发生了什么。C编程语言的失败之处只是向你提供接触背后真正工做原理的途径,而且告诉了你一些难以接受的事实。C会向你展现痛苦的真像(红色药丸),它将幕布拉开来向你展现一些神奇的原理。C便是真理。数据库
既然C如此危险,为何还要使用它?由于C给了你力量来穿越抽象的假象,而且将你从愚昧中解放出来。编程
这本书的目的是让你足够熟悉C语言,并可以使用它编写本身的软件,或者修改其余人的代码。这本书的最后,咱们会从一本叫作“K&R C”的名著中选取实际的代码,而且用你学过的知识来作代码审查。你须要学习下面这些东西来达到这一阶段:编程语言
C的基本语法和编写习惯。函数
编译,make
文件和连接。工具
寻找和预防bug。
防护性编程实践。
使C的代码崩溃。
编写基本的Unix系统软件。
截至最后一章,你将会有足够的工具来解决基本的系统软件、库和其它小项目。
这本书为那些已经掌握至少一门编程语言的人而设计。若是你尚未接触过编程,我推荐你先学习笨办法学Python,这本书适用于真正的新手而且适合做为第一本编程书。一旦你学会了Python,你能够返回来开始学习这本书。
对于那些已经学会编程的人,这本书的开头可能有些奇怪。它不像其它书同样,那些书中你会阅读一段段的文字而后编写一些代码。相反,这本书中我会让你当即开始编程,以后我会解释你作了什么。这样更有效果,由于你已经经历过的事情解释起来更加容易。
因为采用了这样的结构,下面是本书中你必须遵照的规则:
手动输入全部代码。不要复制粘贴!
正确地输入全部代码,也包括注释。
运行代码并保证产生相同的输出。
若是出现了bug则修正它。
作附加题时,若是你作不出某道题,立刻跳过。
在寻求帮助以前首先试着本身弄懂。
若是你遵照了这些规则,完成了本书的每一件事,而且还不会编程C代码的话,你至少尝试过了。它并不适用于每一个人,可是尝试的过程会让你成为一个更好的程序员。
我假设你来自于一种弱者的语言。这些“易用的”语言之一是Python或者Ruby,它们带给了你草率的思惟和半吊子的黑魔法。或者,你可能使用相似Lisp的语言,它假设计算机是纯函数式的奇幻大陆,带有一些为婴儿准备的充气墙。再或者你可能学过Prolog,因而你认为整个世界都是一个数据库,你能够从中寻找线索。甚至更糟糕的是,我假设你一直都在用IDE,因此你的大脑布满了内存漏洞,而且你每打三个字符都要按CTRL+空格来打出函数的整个名字。
不管你的背景如何,你均可能不擅长下面四个技能:
阅读和编写
若是你使用IDE这会尤为正确。可是整体上我发现程序员作了不少“略读”,而且在理解上存在问题。它们会略读须要详细理解的代码,而且以为他们已经理解了但事实上没有。其它语言提供了可让他们避免实际编写任何代码的工具,因此面对一种相似C的语言时,他们就玩完了。你须要知道每一个人都有这个问题,而且你能够经过强迫本身慢下来而且仔细对待阅读和编写代码来改正它。一开始你可能感到痛苦和无聊,可是这样的次数多了它也就变得容易了。
专一细节
每一个人都不擅长这方面,它也是劣质软件的罪魁祸首。其它语言让你不会集中注意力,可是C要求你集中所有注意力,由于它直接在机器上运行,而且机器比较挑剔。C中没有“类似的类型”或者“足够接近”,因此你须要注意,再三检查你的代码,并假设你写的任何代码都是错的,直到你能证实它是对的。
定位差别
其它语言程序员的一个关键问题就是他们的大脑被训练来指出那个语言的差别,而不是C。当你对比你的代码和我练习中的代码时,你的眼睛会跳过你认为不重要或者不熟悉的字符。我会给你一些策略来强制你观察你的错误,可是要记住若是你的代码并不彻底像书中的代码,它就是错的。
规划和调试
我喜欢其它较简单的语言,由于我能够想怎么写就怎么写。我将已有的想法输入进解释器,而后能够当即看到结果。你能够把你的想法试验出来,可是要注意,若是你仍然打算“试验代码使其可以工做”,它就行不通了。C对于你来讲稍困难,由于你须要规划好首先建立什么。的确,你也能够进行试验,可是比起其余语言,你必须在C中更早地严肃对待代码。我会教给你在编程以前规划程序核心部分的方法,这对于使你成为更好的程序员十分有帮助。即便一个很小的规划,都会使接下来的事情变得顺利。
学习C语言会使你变成更好的程序员,由于会强制你更早、更频繁地解决这些问题。你不会再草率地编写半吊子的代码,代码也会可以正常工做。C的优点是,它是一个简单的语言,你能够本身来弄清楚,这使得它成为用于学习机器,以及提高程序员核心技能的最佳语言。
C比其它语言都要难,而这是因为C并不对你隐藏细节,它们在其它语言中都试图而且未能被掩盖。
原书在完稿以后能够自由分发,而且能在亚马逊上购买。该中译版本遵循CC BY-NC-SA 4.0协议,你能够在保留署名和出处的前提下以非商业目的自由转载。