- 定价:¥45.00
- 校园优惠价:¥39.60 (88折) (马上了解)
- 评分:
(已有180条评价)
- 促销活动:
- 此商品暂时缺货(可留下联系方式,到货将第一时间通知您)
基本信息
- 原书名:Expert C Programming
- 原出版社: Prentice Hall PTR
【插图】

编辑推荐
上架首月即进入china-pub畅销榜TOP10 .
专家级的C编程指南展示优秀C程序员的编程技巧..
聆听大师教诲 掌握编程精髓...
内容简介
作译者
目录
1.1 C语言的史前阶段
1.2 C语言的早期体验
1.3 标准I/O库和C预处理器
1.4 K&R C
1.5 今日之ANSI C
1.6 它很棒,但它符合标准吗
1.7 编译限制
1.8 ANSI C标准的结构
1.9 阅读ANSI C标准,寻找乐趣和裨益
1.10 “安静的改变”究竟有多少安静
1.11 轻松一下——由编译器定义的Pragmas效果
第2章 这不是Bug,而是语言特性
2.1 这关语言特性何事,在Fortran里这就是Bug呀
2.2 多做之过
2.3 误做之过
2.4 少做之过
2.5 轻松一下——有些特性确实就是Bug
2.6 参考文献
第3章 分析C语言的声明
前言
——Barbara Ling
所有的C程序都做同一件事,观察一个字符,然后啥也不干。
——Peter Weinberger
你是否注意到市面上存有大量的C语言编程书籍,它们的书名具有一定的启示性,如:C Traps and Pitfalls(本书中文版《C陷阱与缺陷》已由人民邮电出版社出版),The C Puzzle Book,Obfuscated C and Other Mysteries,而其他的编程语言好像没有这类书。这里有一个很充分的理由!
C语言编程是一项技艺,需要多年历练才能达到较为完善的境界。一个头脑敏捷的人很快就能学会C语言中基础的东西。但要品味出C语言的细微之处,并通过大量编写各种不同程序成为C语言专家,则耗时甚巨。打个比方说,这是在巴黎点一杯咖啡与在地铁里告诉土生土长的巴黎人该在哪里下车之间的差别。本书是一本关于ANSI C编程语言的高级读本。它适用于已经编写过C程序的人,以及那些想迅速获取一些专家观点和技巧的人。
编程专家在多年的实践中建立了自己的技术工具箱,里面是形形色色的习惯用法、代码片段和灵活掌握的技巧。他们站在其他更有经验的同事的肩膀上,或是直接领悟他们的代码,或是在维护其他人的代码时聆听他们的教诲,随着时间的推移,逐步形成了这些东西。另外一种成为C编程高手的途径是自省,在认识错误的过程中进步。几乎每个C语言编程新手都曾犯过下面这样的书写错误:
if(i = 3)
正确的应该是:
if(i == 3)
一旦有过这样的经历,这种痛苦的错误(需要进行比较时误用了赋值符号)一般不会再犯。有些程序员甚至养成了一种习惯,在比较式中先写常数,如:if(3==i)。这样,如果不小心误用了赋值符号,编译器就会发出“attempted assighnment to literal(试图向常数赋值)”的错误信息。虽然当你比较两个变量时,这种技巧起不了作用。但是,积少成多,如果你一直留心这些小技巧,迟早会对你有所帮助的。
价值2000万美元的Bug
1993年春天,在SunSoft的操作系统开发小组里,我们接到了一个“一级优先”的Bug报告,是一个关于异步I/O库的问题。如果这个Bug不解决,将会使一桩价值2000万美元的硬件产品生意告吹,因为对方需要使用这个库的功能。所以,我们顶着重压寻找这个Bug。经过几次紧张的调试,问题被圈定在下面这条语句上:
X== 2;
这是个打字错误,它的原意是一条赋值语句。程序员的手指放在“=”键上,不小心多按了一下。这条语句成了将x与2进行比较,比较结果是true或者false,然后丢弃这个比较结果。
C语言的表达能力也实在是强,编译器对于“求一个表达式的值,但不使用该值”这样的语句竟然也能接受,并且不发出任何警告,只是简单地把返回结果丢弃。我们不知道是应该为及时找到这个问题的好运气而庆幸,还是应该为这样一个常见的打字错误可能付出高昂的代价而痛心疾首。有些版本的长整数程序已经能够检测到这类问题,但人们很容易忽视这些有用的工具。
本书收集了其他许多有益的故事。它记录了许多经验丰富的程序员的智慧,避免读者再走弯路。当你来到一个看上去很熟的地方,却发现许多角落依然陌生,本书就像是一个细心的向导,帮助你探索这些角落。本书对一些主要话题如声明、数组/指针等作了深入的讨论,同时提供了许多提示和记忆方法。本书从头到尾都采用了ANSI C的术语,在必要时我会用日常用语来诠释。
编程挑战..
小启发
我们设置了“编程挑战”这个小栏目,像这样以框的形式出现。
序言
编程应该是一项精妙绝伦、充满生机、富有挑战的活动,而讲述编程的书籍也应时时进射出激情的火花。本书也是一本教学性质的书籍,但它希望重新把快乐融入编程之中。如果本书不合你的口味,请把它放回到书架上,但务必放到更显眼的位置上,这里先谢过了。
好,听了这个开场白,你不免有所疑问:关于C语言编程的书可以说是不胜枚举,那么这本书又有什么独到之处呢?
《C专家编程》应该是每位程序员的第二本学习C语言的书。这里所提到的绝大多数教程、提示和技巧都是无法在其他书上找到的,即使有的话,它们通常也是作为心得体会手工记录在手册的书页空白处或旧打印纸的背面。作者以及Sun公司编译器和操作系统小组的同事们在多年C语言编程实践中,积累了大量的知识和经验。书中讲述了许多有趣的C语言故事和轶闻,诸如连接到因特网上的自动售货机、太空软件中存在的问题,以及一个C语言的缺陷怎样使整个AT&T长途电话网络瘫痪等。本书的最后一章是C++语言的轻松教程,帮助你精通这门日益流行的从C语言演化而来的语言。
本书讲述的是应用于PC和UNIX系统上的ANSI标准C语言。对C语言中与UNIX平台复杂的硬件结构(如虚拟内存等)相关的特性作了详细描述。对于PC的内存模型和Intel8086系列对C语言产生影响的部分也作了全面介绍。C语言基础相当扎实的人很快就会发现书中充满了很多程序员可能需要多年实践才能领会的技巧、提示和捷径。它覆盖了许多令C程序员困惑的主题:..
●typedef struct bar{int bar;}bar的真正意思是什么?
●我怎样把一些大小不同的多维数组传递到同一个函数中?
●为什么extern char*p:同另一个文件的char p[100];不能够匹配?
●什么是总线错误(bus error)?什么是段违规(segmentation violation)?
●char*foo[]和char(*foo)[]有何不同?
如果你对这些问题不是很有把握,很想知道C语言专家是如何处理它们的,那么请继续阅读!即使你对这些问题已经了如指掌,对C语言的其他细节也是耳熟能详,那么也请阅读本书,继续充实你的知识。如果觉得不好意思,就告诉书店职员“我是为朋友买书。”...
Peter Van Der Linden于加州砖谷
媒体评论
C诡异离奇,缺陷重重,却获得了巨大的成功。
——Dennis Ritchie
1.1 C语言的史前阶段
听上去有些荒谬,C语言的产生竟然源于一个失败的项目。1969年,通用电气、麻省理工学院和贝尔实验室联合创立了一个庞大的项目——Multics工程。该项目的目的是创建一个操作系统,但显然遇到了麻烦:它不但无法交付原先所承诺的快速而便捷的在线系统,甚至连一点有用的东西都没有弄出来。虽然开发小组最终勉强让Multics开动起来,但他们还是陷入了泥淖,就像IBM在OS/360上面一样。他们试图建立一个非常巨大的操作系统,能够应用于规模很小的硬件系统中。Multics成了总结工程教训的宝库,但它同时也为C语言体现“小即是美”铺平了道路。
当心灰意冷的贝尔实验室的专家们撤离Multics工程后,他们又去寻找其他任务。其中一位名叫Ken Thompson的研究人员对另一个操作系统很感兴趣,他为此好几次向贝尔管理层提议,但均遭否决。在等待官方批准时,Thompson和他的同事Dennis Ritchie自娱自乐,把Thompson的“太空旅行”软件移植到不太常用的PDP-7系统上。太空旅行软件模拟太阳系的主要星体,把它们显示在图形屏幕上,并创建了一架航天飞机,它能够飞行并降落到各个行星上。与此同时,Thompson加紧工作,为PDP-7编写了一个简易的新型操作系统。它比Multics简单得多,也轻便得多。整个系统都是用汇编语言编写的。Brian Kemighan在1970年给它取名为UNIX,自嘲地总结了从Multics中获得的那些不应该做的教训。图1—1描述了早期C、UNIX和相关硬件系统的关系。
是先有C语言还是先有UNIX呢?说起这个问题,人们很容易陷入先有鸡还是先有蛋的套套中。确切地说,UNIX比C语言出现得早(这也是为什么UNIX的系统时间是从1970年1月1日起按秒计算的,它就是那时候产生的啊)。然而,我们这里讨论的不是家禽趣闻,而是编程故事。用汇编语言编写UNIX显得很笨拙,在编制数据结构时浪费了大量的时间,而且系统难以调试,理解起来也很困难。Thompson想利用高级语言的一些优点,但又不想像PL/I那样效率低下,也不想碰见在Multics中曾遇到过的复杂问题。在用Fortran进行了一番简短而又不成功的尝试之后,Thompson创建了B语言,他把用于研究的语言BCPL作了简化,使B的解释器能常驻于PDP-7只有8KB大小的内存中。B语言从来不曾真正成功过,因为硬件系统的内存限制,它只允许放置解释器,而不是编译器,由此产生的低效阻碍了使用B语言进行UNIX自身的系统编程。
书摘
C诡异离奇,缺陷重重,却获得了巨大的成功。.
——Dennis Ritchie
1.1 C语言的史前阶段
听上去有些荒谬,C语言的产生竟然源于一个失败的项目。1969年,通用电气、麻省理工学院和贝尔实验室联合创立了一个庞大的项目——Multics工程。该项目的目的是创建一个操作系统,但显然遇到了麻烦:它不但无法交付原先所承诺的快速而便捷的在线系统,甚至连一点有用的东西都没有弄出来。虽然开发小组最终勉强让Multics开动起来,但他们还是陷入了泥淖,就像IBM在OS/360上面一样。他们试图建立一个非常巨大的操作系统,能够应用于规模很小的硬件系统中。Multics成了总结工程教训的宝库,但它同时也为C语言体现“小即是美”铺平了道路。
当心灰意冷的贝尔实验室的专家们撤离Multics工程后,他们又去寻找其他任务。其中一位名叫Ken Thompson的研究人员对另一个操作系统很感兴趣,他为此好几次向贝尔管理层提议,但均遭否决。在等待官方批准时,Thompson和他的同事Dennis Ritchie自娱自乐,把Thompson的“太空旅行”软件移植到不太常用的PDP-7系统上。太空旅行软件模拟太阳系的主要星体,把它们显示在图形屏幕上,并创建了一架航天飞机,它能够飞行并降落到各个行星上。与此同时,Thompson加紧工作,为PDP-7编写了一个简易的新型操作系统。它比Multics简单得多,也轻便得多。整个系统都是用汇编语言编写的。Brian Kemighan在1970年给它取名为UNIX,自嘲地总结了从Multics中获得的那些不应该做的教训。图1—1描述了早期C、UNIX和相关硬件系统的关系。..
是先有C语言还是先有UNIX呢?说起这个问题,人们很容易陷入先有鸡还是先有蛋的套套中。确切地说,UNIX比C语言出现得早(这也是为什么UNIX的系统时间是从1970年1月1日起按秒计算的,它就是那时候产生的啊)。然而,我们这里讨论的不是家禽趣闻,而是编程故事。用汇编语言编写UNIX显得很笨拙,在编制数据结构时浪费了大量的时间,而且系统难以调试,理解起来也很困难。Thompson想利用高级语言的一些优点,但又不想像PL/I那样效率低下,也不想碰见在Multics中曾遇到过的复杂问题。在用Fortran进行了一番简短而又不成功的尝试之后,Thompson创建了B语言,他把用于研究的语言BCPL作了简化,使B的解释器能常驻于PDP-7只有8KB大小的内存中。B语言从来不曾真正成功过,因为硬件系统的内存限制,它只允许放置解释器,而不是编译器,由此产生的低效阻碍了使用B语言进行UNIX自身的系统编程。...