谭浩强《C程序设计》(第四版)点评
第1章 程序设计和C语言首先看一下目录 第1章 程序设计和C语言 1.1 什么是计算机程序
1.2 什么是计算机语言
1.3 C语言的发展及其特点
1.4 最简单的C程序设计
1.4.1 最简单的C语言程序举例
1.4.2 C语言程序的结构
1.5 运行C程序的步骤和方法
1.6 程序设计的任务
从这个目录看,内容安排基本是合理的,除了个别标题不通,比如“运行C程序的步骤和方法”,实际上应该是“C程序开发的步骤”,再有“程序设计的任务”则基本上是文不对题 。
常识性的错误以及信口开河依旧很多,比如:
计算机发展的初期,一般计算机的指令长度为16,
不晓得老谭把什么时代算做“计算机发展的初期”
C99建议把main函数指定为int型(整型)
其实是C89标准的规定,老谭大概是为以前的void main找台阶
1983年,美国国家标准协会(ANSI)成立了一个委员会,根据C语言问世以来各种版本对C语言的发展和扩充,制定了第一个C语言标准草案(‘83 ANSI C)
曾经的子虚乌有的“87 ANSI C”不见了,很好。但这个‘83 ANSI C是哪来的呢?
C语言的运算符包含的范围很广泛,共有34种运算符(见附录C)。
这个恐怕要麻烦老谭自己去亲自数数了。34种究竟是怎么数出来的呢?再说附录C也不是关于运算符的啊
C语言把括号、赋值和强制类型转换等都作为运算符处理,从而使C语言的运算类型极其丰富,表达式类型多样化。
怎么就“从而使”了呢?哪来的这种因果关系?
“运算类型极其丰富”应该是“运算种类极其丰富”
“表达式类型多样化”,不知所云
例如,整型量与字符型数据以及逻辑型数据可以通用。
这是对初学者很严重的误导。另外“量”与“数据”并列,从小学生作文的角度也是说不过去的
C语言……是成功的系统描述语言……
请问是描述什么“系统”?如何“描述”?
而且C编译系统在新的系统上运行时,可以直接编译“标准链接库”中的大部分功能,不需要修改源代码,因为标准链接库是用可移植的C语言写的。
C编译系统在新的系统上运行:估计老谭在linux下成功地运行了他的VC6
可移植的C语言:说实话,没见过这种C语言
可以直接编译“标准链接库”中的大部分功能:看不懂这是说什么哪
在main函数中,在执行的最后设置一个“return 0;”语句。当主函数正常结束时,得到的函数值为0,当执行main函数过程中出现异常或错误时,函数值为一个非0的整数。
写了“return 0;”居然还可能得到“一个非0的整数”?太神奇了吧
C语言是完全模块化和结构化的语言。
什么叫“完全模块化”?什么叫完全结构化?这两个概念的定义是什么?
printf("sum is %d\n", sum);
……在执行printf函数时,将sum变量的值(以十进制整数表示)取代双撇号中的%d。
执行printf函数:怎么读怎么别扭,应该是调用printf函数
将sum变量的值(以十进制整数表示)取代双撇号中的%d:变量的值是取代不了%d的
“C语言程序的结构”这一小节下面的小标题是
1.4.2 C语言程序的结构
(1) 一个程序由一个或多个源程序文件组成。
(2) 函数是C语言的主要组成部分。
(3) 一个函数包括两个部分
(4) 程序总是从main函数开始执行的
(5) 程序中对计算机的操作是由函数中的C语句完成的。
(6) 在每个数据声明和语句的最后必须有一个分号。
(7) C语言本身不提供输入输出语句。
( 8 ) 程序应当包括注释。
仔细回味一下,很有喜感。
即使当作小学生作文,恐怕也不合格吧
“C语言程序的结构”与“C语言本身”提“不提供输入输出语句”有什么关系呢
完全是八杆子打不着的么
1.5 运行C程序的步骤与方法
这一小节讲的实际上是用C语言开发程序的过程与步骤(编辑、编译、链接及运行)
从内容上看,标题文不对题
这一小节的重大疏失是
只讲了编译和运行时发现错误应该返回修改源程序
但对链接时可能也会发生错误却只字未提
事实上链接错误也是编程最常见的错误之一
对这样常见的一大类错误怎么可以忽视呢
语言罗嗦和概念不清的毛病在这一小节同样存在
譬如
(1)上机输入和编辑源程序。通过键盘向计算机输入程序,……
什么叫“通过键盘向计算机输入程序”?难道这不属于“编辑”的范畴吗?
试问老谭,“输入“和”编辑”之间的区分到底应该如何界定?
1.6 程序设计的任务
这是第一章最糟糕的一个小节
首先是文不对题
程序设计的任务只能是解决问题,不可能是别的什么
但这一小节的内容其实是对完整的程序设计过程和步骤的描述
如果仅仅如此
问题并不严重
可是书中对完整的程序设计过程和步骤的描述居然是
从确定问题到最后完成任务,一般经历以下几个工作阶段:
(1)问题分析。……
(2)设计算法。……
(3)编写程序。……
(4)对源程序进行编辑、编译和连接。……
(5)运行程序,分析结果。……
(6)编写文档。……
这种“谭式”工作流程几乎是置几十年来人类程序设计的经验和思考于不顾,全然自创的
不过说实话,我倒更希望老谭的这一小节能找本象样的书抄一抄,因为那样至少不会荒谬的如此离谱
首先,轻飘飘的一句“从确定问题到最后完成任务”
把确定问题当成了轻而易举的一件事
事实上除了判断一个正整数是否是素数这样的问题
“确定问题”的难度常常并不亚于解决问题
其次,老谭的“问题分析”居然是
对于接手的任务要进行认真的分析,研究所给定的条件,分析最后应该到达的目标,找出解决问题的规律,选择解题的方法。在此过程中可以忽律一些次要的因素,使问题抽象化,例如用数学式子表示问题的内在特性。这就是建立模型。
我的印象,这不过是中学数学解题方法与数据建模方法的一种杂交而已,不伦不类四不象。
“对于接手的任务要进行认真的分析,研究所给定的条件”:空对空的废话
“分析最后应该到达的目标”,目标都不明就编程?
“找出解决问题的规律,选择解题的方法”,耳熟,很有亲切感。后来想起来中学数学老师总这么说
“在此过程中可以忽律一些次要的因素”:从胆量方面来说不得不赞一个。复杂的东西咱都退给客户好了
“使问题抽象化”:不知所云
“用数学式子表示问题的内在特性”,软件设计解决的问题有几个有数学式子?
“这就是建立模型”:不打自招
第三,“设计算法”中只字未提数据结构。老谭是强调“算法—程序的灵魂”的,可惜他一点不懂什么叫数据结构
在老谭的影响和带动下,经常看到一群整天把算法挂在嘴边但却连最基本的数据类型都搞不懂的家伙,根本就不能指望他们能懂得数据结构
第四,(3)的“编写程序”和(4)的“对源程序进行编辑”到底有什么分别
第五,(6)编写文档。程序开发完了,终于想起来“文档”了。任何一个软件工程专业的二年级本科生都能指出为什么这很荒谬。更荒谬的是,在老谭那里,“文档”居然不过是“程序说明书”、“帮助(help)”或“readme”。
这一章的习题也很糟糕
习题
6编写一个C程序,输入a,b,c三个值,输出其中最大者。
这道题不具备程序设计习题的最基本要求,是错误的题目。没有人可以做出这种题目。这反映了作者对软件开发基本上一窍不通
关于C语言的学习方法:怎样学习C语言
本文摘自: 编程十万个为什么(http://www.) 详细出处请参考:http://www.