读谭师傅的书(5) 读谭师傅的书(7)
Mar 25

之前已经学习过第二章的总论,现在继续学习。由于第二章整个内容极简单,也和C语言本身没什么太大关系,这里把第二章所有小节一并学习。以下是学习心得。

1、在2.1节中,谭师傅强调了“数值运算算法”和“非数值运算算法”的区别,并说数值运算算法“研究比较深入”,“算法比较成熟”,而非数值运算算法则“难以规范化“,“往往需要…重新设计解决特定问题的专门算法“。我不知道谭师傅有没有哪怕是尝试过学习Java/J2EE、C#/.NET,以及PHP、Perl、Python、Ruby等等语言及其相应framework。不知道谭师傅对它们所包含的“非数值运算算法”是怎么看的。就C或C++而言,不知道谭师傅对于STL、Boost、MFC、WDK等等是个什么看法。不过,考虑到谭师傅用的是TC,我们也不好勉为其难是不是?

2、在2.2节中,谭师傅给出了几个简单算法的例子。例2.1后面的解释中,谭师傅说“S1,S2代表步骤1,步骤2“,那么,前面出现的“步骤S3“是不是要理解成”步骤步骤3“?

3、在利用例2.1讲了循环之后,谭师傅教导我们说,“由于计算机是高速进行运算的自动机器,实现循环是轻而易举的,所有计算机高级语言中都有实现循环的语句,因此,上述算法不仅是正确的,而且是计算机能实现的较好的算法”。其实,算法要写成循环形式,恰恰是因为这样让程序员容易懂,而不是让机器容易懂。这才能解释为什么比较抽象的高级语言可以写出各种各样的循环语句而低级的汇编语言则只有有限几种。再进一步说,把循环语句改写成不循环的语句(loop unrolling)正是程序优化的一个重要手段。这就说明了循环语句绝不总是“计算机能实现的较好的算法”。

4、例2.3要求判定2000到2500年每一年是否闰年,并输出结果。这里谭师傅给出了如下算法:

S1: 2000=>y
S2: 若y不能被4整除,则输出y“不是闰年”。然后转到S6
S3: 若y能被4整除,不能被100整除,则输出y“是闰年”。然后转到S6
S4: 若y能被100整除,又能被400整除,输出y“是闰年”,然后转到S6
S5: 输出y“不是闰年“
S6: y+1=>y
S7: 当y<=2500时,转S2继续执行,否则算法停止。

这里有两个问题。一个是S2和S3中间的句号应该是逗号,否则“然后转到S6”就变成了无条件地转。按谭师傅在2.3节中算法应没有歧义的要求,这个算法是不及格的。第二个问题在于,S3和S4中的第一个条件判断是多余的。如果在程序中写上这样多余的判断,只会让程序更难懂。

5、从例2.1到例2.3,谭师傅一直都是用的“x=>y”来表示把x的值赋于y。到了例2.4,谭师傅突然又用了“x=y”的形式。乘法也直接就用星号(*)来表示。例2.5是更是“=>”和“=”混用。真是让人无所适从。虽然这是讲C语言的书,但谭师傅也要事先交代一下这里的“=”和“*”是什么意思,是不是?

6、在2.3节中,谭师傅说算法应该包含“有限的操作步骤”,然后又进一步说,“如果让计算机执行一个历时1000年才结束的算法,这虽然是有穷的,但超过了合理的限度,人们也不把它视为有效的算法“。我猜谭师傅从来没有研究过什么是复杂度,否则不会这样混淆算法的定义(或算法的有效性)和算法的效率和可行性。

7、谭师傅说,算法应“有零个或多个输入”。通常中文里说“多个”都是指“两个或以上”。那谭师傅的意思是仅有一个输入的不是算法?从后文来看,显然不是这样的。所以我只能理解为谭师傅想重造中文语法。而且,由于不可能有“负”个数的输入,这个所谓的“特性”就是废话一句。

8、第2.4节大部分内容实践当中用不着,就不多说了。只是其中又出现了几种不同的缩进风格(如例2.21)要留意。在该节最后,谭师傅又教导我们说,“应当强调说明的是,写出了C程序,仍然只是描述了算法,并未实现算法。只有运行程序才是实现算法”。如此精辟,不能不单独拿出来欣赏。我开始有点明白谭师傅在第一章里说C语言是一种“系统描述语言”是什么意思了。果然是博大精深。

9、在2.5节中谈到程序设计时,谭师傅很明显对于自下而上的方法不屑一顾,认为那是错的。他说,“有些人胸有全局…叫做自顶向下,逐步细化…另有些人写文章时不写提纲,如同写信一样提起笔就写,想到哪里就写到哪里,直到他认为把想写的内容都写出来了为止。这种方法叫做至下而上,逐步积累“,又说,“用第一种方法考虑周全,结构清晰,层次分明…这就是用工程的方法设计程序“。这么一段话,可以说是真正暴露了谭师傅对于稍大规模开发没有经验,也对工程设计没有概念,以为上面能设计出来的,下面就一定能实现。

好了,第二章就学习到这里了,下次接着学

“读谭师傅的书(6)”有2篇评论

  1. conner Says:

    在谭学习C的年代,他的认识局限于有限的信息。你这样挑错,有些强求。不过获得正确及时的信息早已不是困难,谭的这本书早就应该重写或者被抛弃了。继续大行其道,就是误人子弟。



    我读的这本书第三版是2005年出的,距离C89发表已经有十多年时间,其间K&R在国内也早有影印版。就算他学习C语言时有所局限,写书写成这样很不应该。

  2. 穆扬 Says:

    纯技术问题
    你认为“有零个或多个输入”这种表达不当
    那么你认为应该如何表达?

发表评论

CAPTCHA Image
*