《C程序设计》(第四版)点评——第1章 程序设计和C语言_C语言程序设计书评-查字典图书网
查字典图书网
当前位置: 查字典 > 图书网 > 科技 > C语言程序设计 > 《C程序设计》(第四版)点评——第1章 程序设计和C语言
薛非 C语言程序设计 的书评 发表时间:2010-10-17 21:10:38

《C程序设计》(第四版)点评——第1章 程序设计和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 %dn", 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程序设计》(第四版)点评——第1章 程序设计和C语言”的回应

帝皇法老 2012-12-21 00:25:32

http://bbs.chinaunix.net/thread-1686753-3-1.html
无聊翻了翻楼主的其他帖子,感觉楼主语文水准很低。我同意“教人一些细枝末节的东西,写不好程序”、“细节决定成败”。细节和细枝末节不是一回事。

不是所有东西都能直接通过语言的某些种内部特征表述。
事实上,这也不应该成为一种理想。
语言特征的存在是为了支持各种各样的程序设计风格和技术,
因此,学习一种语言的工作就应该集中于去把握对该语言而言固有的和自然的风格——而不是去理解该语言的所有语言特征的细枝末节。

帝皇法老 2012-12-21 00:09:33

只给出结论却没有支持这个结论的任何例证甚至佐证,即使我完全在说胡话而且你没有必要回答,你也犯了逻辑学的大忌。一切要以客观事实为基础。
另外我从你那个帖子中我可以得出这样的结论,你在帖子回复中对与我的说法类似的说法赞同,此处不发表意见,是你不好好看还是无法理解我的意思?
更奇怪的是你拷贝了一句与主旨无关的可去掉的思维推理性语句,是你鼠标抖了还是无法理解我的意思?

帝皇法老 2012-12-20 23:25:32

莫非你认为
面向过程程序=面向对象程序=程序
究竟谁是民科啊

薛非 2012-12-18 15:52:56

从狭义的角度看,“算法+数据结构=程序”忽略了面向过程程序、面向对象程序和程序的区别
=======================================================
这和老谭一样
属于不知天高地厚
民科

帝皇法老 2012-12-15 23:53:19

仔细从逻辑学的角度分析了一下,我们的观点都经不起推敲,

因为 算法+数据结构=面向过程程序,算法+数据结构=面向对象程序,算法+数据结构=程序
所以 面向过程程序=面向对象程序=程序

您一定会觉得很荒唐!您认为逻辑错误出现在哪儿呢?略加思考便可得知:

从狭义的角度看,“算法+数据结构=程序”忽略了面向过程程序、面向对象程序和程序的区别,导致产生悖论,故此说法不是狭义的说法。如果改成狭义的说法的话,需要引入体系结构论,不够本质,Wirth如果这样写必然不能流传千古。

从广义的角度看,“算法+数据结构=程序”更能反映程序的本质,恰恰体现了Wirth这句话的精妙之处!

综上所述,“算法+数据结构=程序”是个广义的说法,不存在“是否适用”的问题了,“是否适用于面向对象”更加没有意义了,谭某某的说法也就更加荒唐了。

这样一切问题的答案就清晰了,一切争论来源于看待问题的角度差异,逻辑学的确是门很神奇的科学。

薛非 2012-12-03 12:21:24

@帝皇法老
懒得给你科普了
自己去看看吧
http://bbs.chinaunix.net/thread-4056880-1-1.html

薛非 2012-12-02 11:02:26

     【C语言……是成功的系统描述语言……】
     请问是描述什么“系统”?如何“描述”?
     “科普”:“不知道SDL”不是你的错,可您偏偏把“知道SDL”当做别人的错。如果暂且将你所谓的“评论”当做“求助”来看,那也说明你语文有问题,把一个名词强拆成几个词,我还有什么话可说呢?
======================
居然能推出我不知道SDL
这种臆测的本事确实很令我惊奇
我只问你一句
C究竟是不是SDL?

薛非 2012-12-02 10:53:22

     反驳:“算法+数据结构=程序”只适用于面向过程的编程思想。结构化的基础是过程,故可以把结构化看做面向对象和面向过程的中间产物或一种独立存在的编程思想。至于理由,如果我写书我也不会进行阐述,算法和数据结构是无法构建程序结构的。我认为可以将算法和数据结构比喻为血和肉,需要骨架支撑才能成为结构,这样写的好处是防止像您这样的人看不明白。
===================================================

第一句是对错误观点的重复,没有任何说服力。
后面说的只是你“认为”。很可惜,你的“认为”根本没有得到计算机界的承认,否则你也可以像Wirth那样得图灵奖了。
至于“算法和数据结构是无法构建程序结构的”就更荒唐了,基本上就是老谭说的除了算法和数据结构还需要“采用结构化程序设计方法,并且用某一种计算机语言表示”的翻版。把一些无关程序本质、显而易见众所周知的东西当作自己的新发现提出来和Wirth叫板。可惜没人会把你这种用鸡毛蒜皮无关本质的东西来修正大师的真知灼见当作什么新发现,除了您自己。

帝皇法老 2012-11-11 18:00:20

就这样吧,没时间一一回复了

帝皇法老 2012-11-11 17:59:34

  【在main函数中,在执行的最后设置一个“return 0;”语句。当主函数正常结束时,得到的函数值为0,当执行main函数过程中出现异常或错误时,函数值为一个非0的整数。】

  写了“return 0;”居然还可能得到“一个非0的整数”?太神奇了吧

  科普:在程序异常退出时,程序确实返回的是非零值,建议你了解一下PE文件的执行过程。

帝皇法老 2012-11-11 17:36:23

  【而且C 编译系统在新的系统上运行时,可以直接编译“标准链接库”中的大部分功能,不需要修改源代码,因为标准链接库是用可移植的C语言写的。】

  C编译系统在新的系统上运行:估计作者在linux下成功地运行了他的VC6
  可移植的C语言:说实话,没见过这种C语言
  可以直接编译“标准链接库”中的大部分功能:看不懂这是说什么哪

  反驳:嗯!终于找对一句有歧义的话,但看了点评以后,我又笑了!
  绝大多数主流C语言编译系统是跨平台的,尤其是GCC,任何程序员不知道它简直都算是一种耻辱。
  C++相对于C而言(注意是相对),不易于移植,再加上VC编译器称不上主流编译器,无法和GCC等媲美,故不属于可移植的编译系统。
  说“C语言具备可移植性”可能“好”一些,说“可移植的C语言”容易让像某人这样形容词和名词混淆的人看不懂。
  这句话的错误在于对标准链接库上(凭空造了一个定义且不加以诠释),但是对编译器稍微有点了解的人能够“从字面上”理解标准链接库的具体指什么,我现在将这种“理解”总结一下传递给不理解的人。(首先声明下面那个定义是我自己总结的,可能略有问题,理解其含义即可,不必深究。)
  标准链接库是指在不同环境内部对环境起同样作用的库。这个环境可以指操作系统,例如:Windows、Linux等,指操作系统时往往体现在API的不同,也可以指不同的CPU,例如:8051、8086等,往往体现在指令集的不同。

帝皇法老 2012-11-11 16:56:14

   【C语言……是成功的系统描述语言……】
  请问是描述什么“系统”?如何“描述”?
  “科普”:“不知道SDL”不是你的错,可您偏偏把“知道SDL”当做别人的错。如果暂且将你所谓的“评论”当做“求助”来看,那也说明你语文有问题,把一个名词强拆成几个词,我还有什么话可说呢?


   【对于接手的任务要进行认真的分析,研究所给定的条件,分析最后应该到达的目标,找出解决问题的规律,选择解题的方法。在此过程中可以忽律一些次要的因素,使问题抽象化,例如用数学式子表示问题的内在特性。这就是建立模型。】
   我的印象,这不过是中学数学解题方法与数据建模方法的一种杂交而已,不伦不类四不象。“对于接手的任务要进行认真的分析,研究所给定的条件”:空对空的废话。“分析最后应该到达的目标”,目标都不明就编程?“找出解决问题的规律,选择解题的方法”,耳熟,很有亲切感。后来想起来中学数学老师总这么说。“在此过程中可以忽律一些次要的因素”:从胆量方面来说不得不赞一个。复杂的东西都退给客户好了。“使问题抽象化”:不知所云。“用数学式子表示问题的内在特性”,软件设计解决的问题有几个有数学式子?“这就是建立模型”:不打自招,根本就不是在编程。

  反驳:建立模型是编程的一个重要步骤,越来越多的IDE系统集成了建模工具,建模将逐步成为项目开发的必要步骤。这更加衬托出您对标准建模语言(UML)的一无所知(从您对“系统描述语言”发出的疑问亦反映出此问题)。如果您从来不对用数学式子表示问题的内在特性进行研究,可以表明你倾向于系统工具的制作,而疏于工程计算系统、大型游戏、数据库这方面的开发。“在此过程中可以忽律一些次要的因素”,这句话非常正确,你可以类比一下物理学中的“质点”来透彻地理解一下。综上所述,总体反映出您不是在学计算机科学,而仅仅停留在应用的层面,这样您也敢对计算机科学发表错误言论,实在让人心寒!

帝皇法老 2012-11-11 16:25:18

  对于 Wirth 提出的
  算法+数据结构=程序
  老谭评论道:
  【直到今天,这个公式对于过程化程序来说依然是适用的。】
  没有任何理由和依据,而敢于指责大师的公式具有局限性,不能不承认谭大师很有“勇气”。

  反驳:“算法+数据结构=程序”只适用于面向过程的编程思想。结构化的基础是过程,故可以把结构化看做面向对象和面向过程的中间产物或一种独立存在的编程思想。至于理由,如果我写书我也不会进行阐述,算法和数据结构是无法构建程序结构的。我认为可以将算法和数据结构比喻为血和肉,需要骨架支撑才能成为结构,这样写的好处是防止像您这样的人看不明白。

帝皇法老 2012-11-11 15:51:15

这本书存在的问题总所周知,
但看了你的点评,我笑了……
不错的地方让你说错,真正有歧义的地方反而找不到,我该说什么好呢?

凝仔 2011-10-27 17:14:40

我也觉得这书很鸟蛋

薛非 2010-12-03 06:13:36

  又来卖弄你的英文
  英文也许很重要
  但智商更重要
  你到底想说什么
  “Niklaus Wirth” 的名字叫 “ Nikiklause Wirth ” ? 是吗?
  究竟谁是半吊子啊

阿布格里卜 2010-11-29 22:48:01

Wiki英文关于Nikiklause Wirth博士的介绍http://en.wikipedia.org/wiki/Niklaus_Wirth ,PS,LZ用的是中文的Google吧?点一下中文Google下面的Google.com in English,然后搜索Nikiklause Wirth,别说你还真半吊子水,先把英文学学好吧!

薛非 2010-10-22 19:48:07

【第二章 算法——程序的灵魂】
这一章总的来说就如同阑尾,而且是发炎的阑尾。
首先映入眼帘让人感到眼前一亮的是
【著名计算机科学家沃思(Nikiklause Wirth)……】
又来了。有人做过实验,google Nikiklause Wirth搜来的全是中文网页。不要问我为什么,只有智商约等于0的人才会问这样的问题。
由此可见,垃圾也是会疯狂地繁殖的。有人总喜欢沾沾自喜地拿“1100万”说事儿, 我倒想问一句,“1100万”个错误是个什么概念,“1100万”堆垃圾又会造成多大的污染。
对于 Wirth 提出的
算法+数据结构=程序
老谭评论道:
【直到今天,这个公式对于过程化程序来说依然是适用的。】

没有任何理由和依据,而敢于指责大师的公式具有局限性,不能不承认谭大师很有“勇气”。
接着,老谭提出
【实际上,一个过程化的程序除了以上两个主要因素之外,还应当采用结构化程序设计方法进行程序设计,并且用某一种计算机语言表示。因此,算法、数据结构、程序设计方法和语言工具4个方面是一个程序设计人员所应具备的知识,在设计一个程序时要综合运用这几方面的知识。】
感慨:大师总是一针见骨地道出事物的本质;“伪大师”总是点金成铁狗尾续貂并且把水搅混。不妨再续狗尾:小学数学也是“程序设计人员所应具备的知识”。
【2.1 什么是算法】
本小节前半部分介绍什么是算法,后半部分讨论了数值算法与非数值算法。主要毛病在后半部分。
后半部分实际上毫无必要;“数值运算算法”和“非数值运算算法”属于作者闭门造车自创的不规范用语(估计是不怎么读文献所导致);
【对各种数值运算都有比较成熟的算法可供使用】
乃极其武断的信口开河,表明作者对数值计算领域惊人的无知。无知不是过错,但对自己无知的领域随心妄断,是对读者的大不敬