不记得具体从什么时候开始(反正很多年前的事了)的,不少人都陆续批评过谭浩强的《C语言程序设计》,各方面都有扒过。例如,与实践脱节,很多例子在不同编译器上运行是错误的,代码风格糟糕等等方面。这里首先给出本人对《C语言程序设计》的看法:

在国产C语言相关的教材中,《C语言程序设计》应该算是少有的、还算不错的教材

有些人就会想:你是不是收钱了?给《C语言程序设计》打广告吗?错!《C语言程序设计》出版了这么多年,还用着我这个无名之辈去宣传吗?咱又不是比尔盖茨或求伯君!我只是想站在一名图书作者的角度去评价它。当然,我觉得有一点点资格评价它的原因,并不仅仅是因为我写过书,也略懂写书,更是因为《C语言程序设计》曾经是我的大学教材,因为咱不对自己未精读过的书做评价。

与实践脱节?这个批评是错误的吗?严格来讲并不算,但是《C语言程序设计》本身就是一本学校教材,它的定位就是初学者与理论,用与实践相关程度来评价是否有欠妥当?会这样评价的人可以说根本没有用心去看这本书。想要实践方面的书?图书馆里不是有大把吗?现在花点钱可以买到很多书,英文水平不错也能直接看国外原版,从网络下载电子书甚至连都省了。为什么同一个班级毕业的学生,有些人的编程能力差得离谱,而另外少数人却已经达到专业编程员水平?真正的原因不在教材,而在人本身!

有些例程在不同编译器上会出现不同结果?这个批评是错误的吗?严格来讲也并不算,但还是那句话,《C语言程序设计》主要是讲理论的,它只是传达一种学习与思考方法,这才是大学教材应该做的事,而《C语言程序设计》在这方面做得很好。如果在其它编译器上的运行结果不尽相同,你能分析出原因吗?我可以负责地说:认真学过《C语言程序设计》的读者肯定做得到

代码风格也被人批评得体无完肤。举个例子,《C语言程序设计》中很多例程会直接使用多个“常数”(也称为“魔数”),有人批评应该使用#define将它们定义为宏,这样可读性更强。这个说法错了吗?严格来讲也不算!但是如果每写一个仅有几行的代码就使用#define定义为宏,我身为一个作者就坚决不赞同这么做,因为代码少时使用常数没什么问题,不然就会显得冗余(写书灌水),关键要理解代码说明什么

在进行图书撰写时,为了方便读者理解某个知识点,作者会适当编写一些配套代码进行说明,你却关注这段代码是不是用#define或函数,这就不是一个真正用心看书的人该做的正事。相似地,有些人批评《C语言程序设计》中很多例子都是main函数一路写到底,还是那句话:关键要理解代码说明什么。几十行的代码还要弄个函数调用,费不费劲呐?说不定老谭到时采用了函数,又会有一波人说:这么短的代码都用函数,明显是灌水!

我在《显示器件应用分析精粹》中也有一些代码(是C51,不是标准C,但两者相通),但为了使代码更紧凑(不想凑篇幅),比较短的代码也会直接写常数,你觉得这种风格不好?某一段代码如下

图片

我也可以尝试批判一下自己写的代码:delay_us与delay_ms函数竟然写成一行,老龙你是不是吃SHI了?翻阅古今中外的编程书,这样写代码的只有你一家,赶紧自杀谢罪得了!虾米?竟然使用1000这样的“魔数”,你是怎么搞的?不会用#define定义一个宏吗?这么点常识都不知道,还写书!我是绝对不买的!大家也不要买!水平太渣了!本来我是不想说的,但是……虾米?变量i是干什么的?不会取一个有意义的名称吗?左花括号另起并占据一行不行吗?有病呀!虾米?注释用双斜杠,这是什么骚操作?没看到很多嵌入式编程都用/**/……(以下省略吐槽一万字)

片面地批评谁不会呀?这是一种最低级的操作,即使是Linux之父写的代码,要批判总是可以找到攻击点。语言只是工具,真正卓越的编程员不会如此片面地批评《C语言程序设计》,因为TA懂得每本书都会有其定位与局限性,懂得从书本中找到自己真正需要的东西(去“糟粕”留“精华”),懂得从书中提炼出学习方法,懂得使用思辨的方式看待所发现的问题这对于所有行业中有着卓越成就的人都是适用的),而不是简单地从边边角角去批判,这也是一种不理性不成熟的行为。

如果一个人执意要从边边角角找出图书的错误,总是可以成功的,无论是霍金的《时间简史》还是拉扎维的《射频微电子学》,为什么这么说呢?咱们可以放开思路讨论:假设一只仅有二维空间概念的动物,它是其所在空间的一名物理学家,并且也提出了很多真理或定律。但是在我们看来,这些所谓的真理或定律并不一定是正确的,因为所在的维度不一样。同样我们这个维度提出的理论,在更高位面也并不一定是正确的,你同意吗?我想表达的是:每一本书都有其定位与局限性!在某个设定框架内可以做到基本正确,但跳出这个设定却不然,这是无法避免的。如果你决定用心阅读某本书,首先就得接受其定位与局限性,否则你会觉得到处都是错误。

同样,《电容应用分析精粹》中的某些内容,从某些角度来看也许并不严谨,但它只是通过一种使读者更容易理解的方式其定位的读者阐述本不太容易理解的知识点,从这个角度来讲,《电容应用分析精粹》做得很好!具体来讲,在阐述同一个知识点时,《电容应用分析精粹》中会采用某种形象的方式,但在《三极管应用分析精粹》可能就会采用另一种方式,如果要写一本针对在校大学生的教材,同一个知识点的阐述方式又会有所不同。

图书撰写需要站在不同角度去实际操作,当你的读者定位不同时,描述方式或严谨程度是不同的,但重点在于把想要表达的意思清晰地展示出来。记得初中化学老师曾对我们说过一句话:等你们学习高中化学的时候,就会知道现在学到的很多内容是错误的!那我们可以去批判初中化学吗?肯定不妥嘛!因为教育有它自身的客观规律,初中阶段有其自身广度与深度的局限性,要不咱们初中、高中、大学全部一套教材不就完事了?换句话说,会花费宝贵的时间一味地片面找图书问题的人(这种行为就是我们所说的“找茬”,字面意思),本身就存在一些问题,因为TA缺乏最起码的写作意识,也不具备最基本的思辨能力

人这一辈子几十年看似很长,但在整个宇宙中也只不过是一粒尘埃而已,我们应该用有限的生命去做一些有意义的事情,如果非要用一句话来具体概括,我的选择是:态度决定一切

从谭浩强的《C语言程序设计》到《电容应用分析精粹》的更多相关文章

  1. 再论谭浩强《C语言程序设计》

    一些同学学不好C语言,把罪责归于“因为教材是谭浩强写的”实在是很滑稽. 谭浩强老先生 1934 年生,现在已经 80 岁了.他 1958 年从清华大学自动控制系毕业,那年 24 岁.要知道 C 语言那 ...

  2. 挂羊头卖狗肉蓄意欺骗读者——谭浩强《C程序设计(第四版)》中所谓的“按照C99”(二)

    挂羊头卖狗肉蓄意欺骗读者——谭浩强<C程序设计(第四版)>中所谓的“按照C99”(二) 在<谭C>p4:“本书的叙述以C99标准为依据”,下面从C89到C99的主要变化方面来看 ...

  3. C语言学习笔记---谭浩强

    前段时间有机会去面试了一次,真是备受“打击”(其实是启发),总的来说就是让我意识到了学习工具和学习技术的区别.所以最近在看一些数据结构和算法,操作系统,python中的并行编程与异步编程等东西.然而数 ...

  4. c++面向对象程序设计 谭浩强 第一章答案

    c++面向对象程序设计 谭浩强 答案 第一章 目录: c++面向对象程序设计 谭浩强 答案 第一章 c++面向对象程序设计 谭浩强 答案 第二章 c++面向对象程序设计 谭浩强 答案 第三章 c++面 ...

  5. C程序设计(谭浩强)第五版课后题答案 第一章

    大家好,这篇文章分享了C程序设计(谭浩强)第五版课后题答案,所有程序已经测试能够正常运行,如果小伙伴发现有错误的的地方,欢迎留言告诉我,我会及时改正!感谢大家的观看!!! 1.什么是程序?什么是程序设 ...

  6. c++面向对象程序设计 课后题 答案 谭浩强 第四章

    c++面向对象程序设计课后题答案 谭浩强 第四章 1: #include <iostream> using namespace std; class Complex {public: Co ...

  7. c++面向对象程序设计 谭浩强 第三章答案

    2: #include <iostream> using namespace std; class Date {public: Date(int,int,int); Date(int,in ...

  8. c++面向对象程序设计 谭浩强 第二章答案

    类体内定义成员函数 #include <iostream> using namespace std; class Time { public: void set_time(); void ...

  9. C指针笔试题,蛋疼的多重指针运算,谭浩强的阴影

    对指针的概念清晰的话,做这种题只要耐心就行,然而看这种题就烦(被同学吐槽为谭浩强的阴影……草泥马这种C风格题有意义吗?出题人脑子被门夹了?而且C++11都不支持字面值字符串直接转换成char*了.好吧 ...

随机推荐

  1. Codeforces Round #687 (Div. 2, based on Technocup 2021 Elimination Round 2)

    A. Prison Break 题意:就是在一个n*m的矩阵中,以(1,1)为起点(n,m)为终点,每个点以每个单位1s的速度移动,问总共至少需要多少秒,所有的矩阵点就能够全部移动到(r,c)中 思路 ...

  2. oo第四单元作业总结

    一.本单元两次作业的架构: 本单元两次作业的架构基本是一致的,所以两次作业的架构就一起说了. 为了避免查询时出现同一个结果反复计算的情况(连续两次查询一个类的顶级父类,如果我们在查询的指令中来计算其父 ...

  3. [源码解析] 并行分布式框架 Celery 之 Lamport 逻辑时钟 & Mingle

    [源码解析] 并行分布式框架 Celery 之 Lamport 逻辑时钟 & Mingle 目录 [源码解析] 并行分布式框架 Celery 之 Lamport 逻辑时钟 & Ming ...

  4. Java GUI学习,贪吃蛇小游戏

    JAVA GUI练习 贪吃蛇小游戏 前几天虽然生病了,但还是跟着狂神学习了GUI的方面,跟着练习了贪吃蛇的小项目,这里有狂神写的源码点我下载,还有我跟着敲的点我下载,嘿嘿,也就注释了下重要的地方,这方 ...

  5. 华为eNSP模拟器— telnet实验

    华为eNSP模拟器-telnet实验 一.实验一 路由交换之间实现telnet登陆 实验拓扑 实验目的: 路由器作为 telnet 服务器 交换机作为客户端去连接路由器 实验步骤: 路由器配置 < ...

  6. 保存 yum 下载的软件包并制作成本地 yum 源

    保存 yum 下载的软件包并制作成本地 yum 源 实验对象 CentOS 7 yum 安装 nginx (nginx必须使用第三源才能安装:redhat8版本的则不需要,官网源自带nginx软件包) ...

  7. Linux_网络基础管理

    一.网卡的命名 1.传统网卡命名 eth0.eth1.eth2.eth3......... wlan0.wlan1.waln2.wlan3......... 2.RHEL7命名机制 systemd对网 ...

  8. linux各文件夹的作用-(转自玉米疯收)

    linux下的文件结构,看看每个文件夹都是干吗用的 /bin 二进制可执行命令 /dev 设备特殊文件 /etc 系统管理和配置文件 /etc/rc.d 启动的配置文件和脚本 /home 用户主目录的 ...

  9. STM32程序的启动

    普及: 不同位置启动首需要硬件上的配合:BOOT1与BOOT0 引脚电平配合,一般默认使用主闪存存储: 也就是BOOT0 = 0; 启动时将现在起始模式的初始地址映射到了0x0000 0000,内部S ...

  10. 10.21 nmap:网络探测工具和安全/端口扫描器

    nmap命令 是一款开放源代码的网络探测和安全审核工具,是Network Mapper的缩写.其设计目标是快速地扫描大型网络.nmap可以发现网络上有哪些主机,主机提供了什么服务(应用程序名称和版本号 ...