`
talin2010
  • 浏览: 521194 次
  • 性别: Icon_minigender_1
  • 来自: 河北
社区版块
存档分类
最新评论

《狂人C》读評(一) 理解程序设计篇

阅读更多

KBTiller兄在书籍扉页写指正,不敢指正,共同讨论。其实第一篇在年前已看完,由于过节心态浮躁一直没能总结记录。仔细想想自己真是拖拉的要命,再不写点东西对不起KBTiller兄的热情心意。本文大部分内容属于跟作者观点不一致的描述,我不是初学者,所以与其是读书笔记,不如说挑刺,尽管这样,书中还是有不少让我受益良多的地方。为了整理方便,主体内容分四个不同的部分,有的问题分界比较模糊,主观因素比重很大。至于为什么会这么长,那是因为我吹毛求疵了 :)。

一、精彩绝伦:我认为的很出彩的地方

1、最精彩的地方就是作者对细节对技术本质的探索,这点让我肃然起敬,这才是一个工程师应该具备的最高的品质。
2、P22 这个NEO画的真神了(KBTiller兄你想累死初学者么 ^^)。
3、P27 正文第3段第1行 “从这两条规则中发现在代码中只能写成正的十进制整数常数”,以前一直没有发现这点,读到这里真是如醍醐灌顶!P39的练习也是这个道理。
4、强调数据类型为基本是本书在技术上最特色的闪光点,数据类型的确是C语言的复杂所在,也是最难正确理解和使用地方,在我读的任何一本C语言书籍中还没有能系统的提及此,作者几乎对每个类型都做了深入分析,赞!
5、P71-P73 专门讲解了优先级结合性和运算次序的关系,这也是C语言中非常让人迷惑的地方,很多学了三五年的熟手还经常会犯错误,归根结底就是当初基础没打好,这里非常专业的分析了它们之间的关系,帮助初学者避免很多问题,这是很多C语言书籍尤其是国内教科书最欠缺的地方。
6、把=读成赋值,这个主意的确非常棒。
7、P111利用判断三角形种类这个问题来锻炼读者的逻辑判断能力是非常恰到好处的。初学者对代码的理解和控制不够熟练,往往会出现逻辑混乱的状况,这时候正需要加强练习。
8、P142用了小4页来讲解++ -- 运算符,帮”教授“和”专家“们的学生排除遗毒,作者大人辛苦了!


二、知识错误:知识点出错或者遗漏的地方

1、P7正文第4段第1行 “1987年87 ANSI C公布”,根据我在维基百科和C参考手册上的资料得知,ANSI C委员会是在1982年筹建,1983年正式成立的,而在1989年推出了ANSI C标准,俗称C89,这里是应该是错误了。
2、P13正文第8段第8行 “其中的字符都原样输出,除非出现“\”引导的字符序列或“%”引导的字符序列” 除了\和%引导的字符序列外,??引导的三字符序列也会被转换,尽管这个家伙几乎被遗忘了。
3、P13代码第3块第一行 “\" 、\n 、\a 、\b 、\t 、\\ 、\" 、\'”,这里怎么多了一个\",而且少了\v \f \r \? ,这属于字符转义符,还有别的转义符,描述不够精确。P49也有这个问题。
4、P14脚注1 “目前好像还没有实现可以使用汉字的C语言编译器” P16脚注1也是。VS2008中文版支持中文字符作为标识符,当时发现了这个的缘故是自己define出来一套汉编。看到这个,再版书籍的时候会不会考虑使用VC++ Express作为首选IDE呢,呵呵。
5、P24正文第4段第2行 “称呼这种编号的专业术语有很多种,有的叫ASCII码,有的叫内码,有的叫Unicode编码” ASCII码和Unicode编码都是内码的一种(如果英文也有内码这种说法的话),在这里把他们并列起来描述不适合,应该把内码删掉,换成其他的,如GBK/GB2312。
6、P48正文第4段第3行 “所以 signed是可以省写的这一说法,如果不说是错误的,那么至少是不严谨的。” 其实就是错误的,不能省略,在函数的声明和定义中如果一个使用 signed char 一个使用 char ,gcc下会编译出错,这点在CU论坛上也讨论过了,不多做解释,详细见链接:http://bbs.chinaunix.net/thread-1834841-2-11.html 从17楼开始,中有素质低下者请自动无视。
7、P82正文第10段第1行 “在{}之内,C99以前的规定是先把对编译器的事儿说完,再说让CPU做的事。也就是说要先写声明,再写语句”。C89也没有这个规矩阿,大概是K&R的C才会有这个要求(K&R要不要求我还真不清楚,但TurboC会要求)。

三、表述不当:在书中出现的位置不对或者容易引发歧义或者笔误疏漏的地方

1、P3正文第2段第1行 “通常我们所看到的计算机,一般都会有键盘、鼠标、显示器、机箱等几个部分”。这里讲机箱并不太合适,毕竟机箱只是一个空壳子,里面的内容才是最重要的,所以把“机箱”改成“主机”更适合。
2、P6正文第21段第1行 “汇编语言用助记符(add ,move)”,前面给出的例子是用的mov,但这里写出来是move,还是统一更好。
3、P7正文第4段第2行 “这个标准在1990年被国际标准化组织(International Standards Organization,ISO)”,ISO的英文标准名字是International Organization for Standardization 虽然看起来很古怪(貌似缩写成IOS更合适 --!)而且在后面P47也是用的International Organization for Standardization,所以这里要统一下。
4、P9正文第3段第1行 “由于使用了一段事先写好的程序段(这是编译器提供的)”。在这里说的是printf库函数,库函数不是编译器的一部分,但初学者又不知道啥叫函数库,所以建议改成“这是随编译器一起提供的”。
5、P16正文第8段第3行 “如表1-1所示,是C99新增的关键字。” 但是表1-1给出的是C99全部关键字,只有被加了标注的才是新增关键字,而且语法也有点问题。所以这里个人建议更改为“表1-1是C99全部的关键字。”
6、P20练习2.6 “使用printf()函数应在代码开头的位置通过编译是编译器处理命令对函数的名称做相应的说明“。 “编译是”应该是笔误。
7、P25正文第3段第2行 “在123后面写;是因为123无法被单独写在代码中。” 这句话理解起来不太得劲,建议改成“无法单独作为一句代码”更好。
8、P32正文第2段第1行 “内存(Memery Unit)这个词,本来就是记忆器件的意思。” Memery Unit最好翻译成内存单元,毕竟后面跟了个Unit。
9、P36正文15段第1行 “求一个负数的补码,还可以用2^机器数的总位数 减去这个数直接得到。” 减负等于加正,所以应该是“加上这个数直接得到”。
10、P49代码第5块 “\八进制数 \x十六进制数” ,C语言对转义字符的长度还是有要求的,八进制不能超过3个,十六进制不超过2个,这应该在后面写上。
11、P60正文第6段第2行 “然而12/10用%2d输出的是1,也就是说不会输出1前面的0,如果希望输出为02,则在%与2d之间应再在写个0——%02d” ,这里应该是要输出01,笔误写成02了。
12、P65习题12.“输入一身份证号码,输出这个人的生日。” 之前没有讲任何输入函数,所以这道题不适合在这里出现。
13、P67正文第3段 运算符介绍,有后缀运算符,但是没有说前缀运算符。
14、P69正文第3段第1句,“在这个表达式中,赋值号右面的表达式中的...” 前面一直把=称为赋值运算符,在这里忽然冒出个赋值号,不和谐阿。
15、P73脚注2 “利用续行的标志,从某种意义上说,单调也可以割裂”,“单词”笔误成“单调”,这里瞬间联想到严谨而又慈祥的高数老师。
16、P75正文11段第3行 “不要对cast运算有更多想入非非的非分之想”, 非分之想已经有想入非非的意思,再加上这个就显得太啰嗦,可以把想入非非去掉。
17、P84代码使用了scanf语句,这是本书第一次提到这个语句,但是没有任何讲解,建议解释下scanf的基本用法,简单的可以说下代码中出现的用法。
18、P128图4-6”程序开发过程示意图“ 这个图除了注释用的椭圆外看起来跟程序流程图差不多,有个结束框,但是开始框在哪里呢?为了确保完整性和一致性建议把开始框加上。
19、P131正文第7段第1行 “如果表达式的值不为0,执行语句,然后转至(0)再次求表达式的值” 上面没有(0)这一项,笔误了,应该是(1)。P138也有此错误,浮想联翩。
20、P136正文第3段第3行 “测试结果表明,输入0整数时,程序的运行是有问题的。” 这里少了一个字,应该是“输入0个整数“。
21、P137代码第2块第1行 ”while (printf("....")) \“ 这句代码后面有一个”\“ ,但是这里不用这个转义符代码也不会出错,显得多余了,\一般都是用到宏上。
22、P146正文第5段第3行 “画虎不成反成犬”,无论从用词还是用google得到的结果来看都是“画虎不成反类犬”更适合 ^^
23、P149代码第14,15行 见上面第21点。
24、P150正文第4段第2行 “此外for语句()内的表达式2部分也写的更简洁了。” 这里不只写的简洁,而且减少了判断次数,增加了运行效率,这点我认为也可以提一下。
25、P158正文10段第1行 ”序点之前要求计算机执行的运算及副效应在序点处必须完成“ 听起来怪怪的,这样如何:”计算机执行的运算及副效应在序点前必须完成“。

四、观点差异:不算错误,但是主观差异较大的地方

1、P9 脚注3 “使用IDE需要冒着被指责为菜鸟的风险,有些高手更喜欢表明自己不使用IDE而使用一些更为原始的开发环境。但总的来说,使用IDE开发软件更为方便。” 这句话我是赞同的,对于初学者来说IDE可以隐藏很多繁琐的细节,但有些细节对以后的发展会很重要,例如编译和链接。只有使用了命令行才会真正了解编译参数和链接过程,这是绝大部分C语言入门书籍没有教导,甚至没有提及的(大概跟平台差异性太大有关)。但是我觉得还是有必要在适当的时候提出一下(例如后面讲标准库的时候,或者把编译和链接作为高级课题专门开一章),不然初学者就根本忘记了有这么回事。
2、P32正文13段第1行 “变量是一段连续的、被命名了的、用于存放数据的、且可以求得其位置的、具有类型含义的存储空间” 这里有个比较特殊的变量是register变量,register变量是不能取地址的,因为它可能存在寄存器而非内存中。知道它存在寄存器(但不知道哪个编号的寄存器)算不算知道了位置了呢?这就是个见仁见智的问题。
3、从P71至P84,中间讲述了运算符优先级、结合性、类型转换、语句的各种概念这种纯理论的要点,个人觉得这些知识点太密集了,而且中间实际例题(完整代码的例题)也很少,这样给初学者压力很大,建议还是中间插入写例题缓和下进度,或者把知识点分散到别的章节。
4、P96正文第4/5段第1句 “由于3的确小于4,所以3<4的运算结果为1” “由于4<3这个关系并不成立,所以4<3的运算得到的值为0” 这里是第一次接触到关系运算,读者之前并没有任何关系运算的概念和知识,也不知有任何因果关系,所以这里的“由于...所以...”这种用词不当,用叙述式的语气更符合,但如果说是作者教导的推理也可以过得去。
5、P97 4.22 P139 5.22 标题都是 ”例题“ 这似乎不太正规,尤其是会出现在目录中的这种大标题,建议加上个限定语。
6、P110 P111代码块 “if (pfh_d==1)” "if (pfh_d==true)" 这是讲解_Bool类型用法的时候给的例子。但我们把一个量当作布尔类型的时候往往不会使用判等运算符,因为变量本真就有真假的含义,而不用绕一步判断是否和真相等。所以一般都这样写,更简洁更容易理解 "if (pfh_d)"。
7、P118 “大师如是说goto” 这里有点过于仓促了,我起码会在两个地方用到goto 1、不同地方产生不同的返回值,但为了确保代码结构清晰或者返回前有统一的事情要做,只用一个return返回。 2、循环/switch嵌套直接跳出。关于这点在CU上也讨论过了,不再多说。

分享到:
评论

相关推荐

    狂人C-程序员入门必备(完整目录超清晰)

    【标题】"狂人C-程序员入门必备(完整目录超清晰)"所涵盖的知识点主要集中在C语言的基础学习上,这是一本专为初学者设计的教程。C语言是计算机科学中的基础编程语言,以其高效、灵活和底层控制能力著称。通过这本书,...

    狂人C-程序员入门必备

    首先,C语言被描述为一种强大、高效、优美的程序设计语言。它的实用性、简洁性、高效性和强大的表达力是其核心特征。C语言的普及和应用广泛,从操作系统UNIX到现代软件开发,C语言都扮演了极其重要的角色。UNIX操作...

    狂人C-程序员入门必备part1

     全书分为3个部分:理解程序设计,结构化程序设计与数据的组织和c语言的高级话题。体现了从零基础到c编程高手层次递进的特点。  全书贯穿大量生动实例,讲述从问题的提出、问题的分析、代码的编写到程序测试的全部...

    《狂人C_程序员入门必备》作者_ 键盘农夫 应该是最好的入门书籍了

     全书分为3个部分:理解程序设计,结构化程序设计与数据的组织和c语言的高级话题。体现了从零基础到c编程高手层次递进的特点。  全书贯穿大量生动实例,讲述从问题的提出、问题的分析、代码的编写到程序测试的全部...

    狂人引擎全套,狂人装备最新,C,C++源码.zip

    【狂人引擎全套】指的是一个全面的软件开发项目,它可能包含了从底层到上层的各种组件,用于构建游戏或者其他类型的应用程序。这个引擎的核心部分很可能使用了C和C++这两种编程语言,因为这两种语言在游戏引擎开发中...

    c代码-散列表练习题:电话狂人

    "电话狂人"这个练习题很可能是设计一个C语言程序,用散列表来解决与电话号码相关的问题,比如存储和查找联系人。 散列表的核心是散列函数,它将键转化为数组的索引。一个好的散列函数应该使得不同键尽可能地分散在...

    编程狂人第八期(2014-1-13)

    由于给定的内容是关于一本技术周刊《编程狂人...以上知识点,涉及了业界最新动态、前端开发技术、多种编程语言的使用和比较、程序设计与架构、以及开发者个人成长等多个领域,为IT从业者提供了一个全面的行业知识视角。

    ASP.NET源码——[论坛社区]狂人论坛 v4.0 C982.NET版.zip

    【狂人论坛 v4.0 C982.NET版】是一个基于ASP.NET技术构建的社区论坛系统,旨在为用户提供互动交流的平台。该版本的源码对于开发者来说是一份宝贵的资源,可以用来学习和理解ASP.NET框架在实际项目中的应用。下面我们...

    C#狂人论坛 v4.0~源码

    这个开源项目旨在帮助开发者深入理解C#语言的运用,以及.NET框架下的Web应用程序开发。通过研究这个源码,你可以了解到如何构建一个功能完善的在线论坛系统,涵盖用户注册、登录、发帖、回帖、论坛管理等多个模块。 ...

    编程狂人第三十九期.pdf

    - **定位**:《编程狂人》是一份面向广大程序员的技术周刊,旨在通过技术手段筛选出高质量的文章内容,并辅以人工筛选,确保内容质量。 - **发布周期**:该周刊通常在每周二的某个时间点发布,鼓励读者关注并阅读。 ...

    可变目标C编译器—设计与实现.rar

    《可变目标C编译器—设计与实现》是一本深入探讨C编译器设计与实现的专业教程。C语言作为广泛应用的编程语言,其编译器的构建是计算机科学领域中的核心课题,对于理解计算机系统的工作原理以及软件开发流程具有重要...

    编译原理实验程序

    在这个“编译原理实验程序”中,我们使用C语言编写了一个针对Cminus语言的词法分析器。Cminus是一种简化版的C语言,用于教学目的,其语法结构相对简单,便于学习和理解编译器的工作原理。 词法分析器通常由两部分...

    C语言课程设计

    尽管这个系统存在不足,它仍能提供一个基础的框架,让学生理解如何在实际问题中运用C语言编程技能。随着学习的深入,可以逐步改进,如增加数据库支持、实现更高效的数据结构、添加更多功能等,以提升系统的完整性和...

    蓝桥杯单片机第九届省赛'彩灯控制器'程序实现

    "蓝桥杯单片机第九届省赛'彩灯控制器'程序实现"是一个关于嵌入式系统设计的项目,主要集中在单片机编程上。蓝桥杯是一项知名的全国性大学生IT技术竞赛,涵盖软件和电子设计等多个领域。在这个特定的比赛中,参赛者...

    第10届蓝桥杯嵌入式比赛省赛程序题程序实现

    在嵌入式比赛中,参赛者需要设计并实现一个能够解决特定问题的系统,这可能涉及到硬件选择、系统架构设计、实时操作系统(RTOS)的选取和移植、驱动程序编写等多个方面。 然后,cube-MX是一个重要的工具,它是...

    寒江独钓——Windows 内核编程与信息安全(免费试读版)

    - **1-1-2 编写第一个C文件**:通过创建简单的C程序来帮助读者熟悉开发环境。 - **1-1-3 编译一个工程**:指导如何构建一个包含多个源文件的工程项目。 - **1-2 安装与运行** - **1-2-1 下载一个安装工具**:...

    基于8051单片机的多功能数字显示电子时钟(包含日历和闹钟)

    源代码中可能包括了8051汇编语言或C语言编写的程序,描述了单片机如何处理时间数据、与74HC595交互,以及如何设置和响应闹钟。原理图将展示硬件组件的连接方式,比如单片机、74HC595、数码管、电源和按键等。 总结...

    JSP实现用户登录验证码验证实例

    验证码验证通常用于防止自动化程序(如机器人)进行恶意操作,例如重复登录尝试或垃圾邮件发送。验证码通过显示一组随机字符,要求用户输入以证明他们是人类,而非机器。 以下是实现这个功能的主要步骤: 1. **...

Global site tag (gtag.js) - Google Analytics