新書推薦:
《
中国经济发展的新阶段:机会与选择
》
售價:NT$
454.0
《
DK月季玫瑰百科
》
售價:NT$
959.0
《
为你想要的生活
》
售價:NT$
301.0
《
关键改变:如何实现自我蜕变
》
售價:NT$
352.0
《
超加工人群:为什么有些食物让人一吃就停不下来
》
售價:NT$
454.0
《
历史的教训(浓缩《文明的故事》精华,总结历史教训的独特见解)
》
售價:NT$
286.0
《
不在场证明谜案(超绝CP陷入冤案!日本文坛超新星推理作家——辻堂梦代表作首次引进!)
》
售價:NT$
265.0
《
明式家具三十年经眼录
》
售價:NT$
2387.0
編輯推薦:
想用C代码编写好玩的游戏吗?想成为C代码侦探,去破解重重谜案吗?或是让C代码变成牵线红娘,帮你找到你的梦中情人?哈哈!别着急,David Griffiths和Dawn Griffiths夫妇的这本Head First C将会带你来到这个奇妙的C语言世界:这里没有令人乏味的“学究腔”,没有冗长枯燥的老生常谈,也没有令人望而却步的大堆练习。作者用诙谐、幽默的口吻为你讲述了一个又一个关于C的故事。无论你是C语言学习航程中的新船员,还是经历过大风大浪的老水手,你都能从Head First C中体会到无限乐趣。
內容簡介:
《嗨翻C语言》向读者提供了C语言的完整学习体验。全书分为三个部分:第1章到第4章是基础知识,包括基本语法、指针、字符串、小工具与源文件;第5章到第8章为进阶内容,有结构、联合、数据结构、堆、函数指针、动静态链接;最后四章是高级主题,内容涵盖了系统调用、进程间通信、网络编程和多线程。每部分结束后还有一个有趣的实验,可以提高读者的实际操作能力。此外,书中还包含大量的图片、示例和代码,有助于读者对于知识的理解和把握。
《嗨翻C语言》适用于C开发人员以及对C语言感兴趣的初学者。
關於作者:
David Griffiths
12岁时看到一部介绍Seymour Papert工作的纪录片,从此踏上编程之路。15岁那年实现了Papert的LOGO编程语言。大学专业是理论数学,毕业后开始编程,并成为一名专栏作家。现在有三个头衔:敏捷教练、程序员和车库管理员。
在《嗨翻C语言》之前,David写过两本Head First系列的书:Head First Rails和Head First Programming。
你可以在Twitter上“粉”David:
http:twitter.comdogriffiths。
Dawn Griffiths
在英国一所顶尖的大学开始了她的数学生涯,获得了数学系的荣誉学位,毕业以后投身软件开发行业,迄今已经有15年的IT行业从业经验。
在和David一起写《嗨翻C语言》之前,Dawn写过两本Head First系列的书(《深入浅出统计学》和Head First 2D Geometry),同时还主持过该系列其他几本书。
目錄 :
目 录
引子
让大脑重视C语言。现在你正试着学习某些东西,为了不让学习卡壳,你的大脑也在帮你的忙,大脑在想:“最好把空间留给重要的事,比如什么动物是危险的?裸体滑雪是不是一个坏主意?”那么怎么才能欺骗你的大脑,让它认为学好C关系到你下半生的幸福呢?
本书为谁而写 xxxii
我们知道你在想什么 xxxiii
元认知 xxxv
驯服你的大脑 xxxvii
用户须知 xxxviii
技术审校团队 xl
致谢 xli
1 进入C语言的世界
C语言入门
想知道计算机在想什么?
你需要为一款新游戏编写高性能的代码吗?你需要为Arduino编程吗?你需要在iPhone应用中使用高级的第三方库吗?如果是的话,C语言就可以帮上忙了。相比其他大多数语言,C语言的工作层次更低,因此理解C语言可以让你更清楚程序在运行时到底发生了什么,C语言还可以帮助你更好地理解其他语言。来吧,拿起编译器,很快你就能入门了。
C语言用来创建空间小、速度快的程序 2
完整的C程序长啥样? 5
如何运行程序? 9
两类命令 14
到目前为止的代码 15
用C语言算牌? 17
布尔运算 18
现在的代码 25
随时转向的命运列车 26
有时一次还不够…… 29
所有循环的结构都相同…… 30
用break语句退出循环…… 31
C语言工具箱 40
2 存储器和指针
指向何方?
如果真的想玩转C语言,就需要理解C语言如何操纵存储器。
C语言在如何使用存储器方面赋予了你更多的掌控权。在本章中,你将揭开存储器神秘的面纱,看到读写变量时到底发生了什么;学习数组的工作原理,以及怎样避免烦人的存储器错误;最重要的是,你将看到掌握指针和存储器寻址对成为一名地道的C程序员来讲有多么重要。
C代码包含指针 42
深入挖掘存储器 43
和指针起航 44
试着传递指向变量的指针 47
使用存储器指针 48
怎么把字符串传给函数? 53
数组变量好比指针…… 54
运行代码时,计算机在想什么 55
数组变量与指针又不完全相同 59
为什么数组从0开始 61
为什么指针有类型 62
用指针输入数据 65
使用scanf时要小心 66
除了scanf还可以用fgets 67
字符串字面值不能更新 72
如果想修改字符串,就复制它 74
把存储器保存在大脑里 80
C语言工具箱 81
2.5 字符串
字符串原理
字符串不只是用来读取的。
在C语言中字符串其实就是char数组,这你已经知道了,问题是字符串能用来干嘛?该string.h出场了。string.h是C标准库的一员,它负责处理字符串。如果想要连接、比较或复制字符串,string.h中的函数就可以派上用场了。在本章中,你将学会如何创建字符串数组,并近距离观察如何使用strstr函数搜索字符串。
不顾一切找Frank 84
创建数组的数组 85
找到包含搜索文本的字符串 86
使用strstr函数 89
该审查代码了 94
“数组的数组”和“指针的数组” 98
C语言工具箱 101
3 创建小工具
做一件事并把它做好
操作系统都有小工具。
C语言小工具执行特定的小任务,例如读写文件、过滤数据。如果想要完成更复杂的任务,可以把多个工具链接在一起。那么如何构建小工具呢?本章
中,你会看到创建小工具的基本要素并学会控制命令行选项、操纵信息流、重定向,并很快建立自己的工具。
小工具可以解决大问题 104
程序如何工作 108
但没有使用文件…… 109
可以用重定向 110
隆重推出标准错误 120
默认情况下,标准错误会发送到显示器 121
fprintf打印到数据流 122
用fprintf修改代码吧 123
灵活的小工具 128
切莫修改geo2json工具 129
一个任务对应一个工具 130
用管道连接输入与输出 131
bermuda工具 132
输出多个文件 137
创建自己的数据流 138
main可以做得更多 141
由库代劳 149
C语言工具箱 156
4 使用多个源文件
分而治之
大程序不等于大源文件。
你能想象一个企业级的程序如果只有一个源文件,维护起来有多么困难与耗时吗?在本章中,你将学习怎样把源代码分解为易于管理的小模块,然后把它们合成一个大程序,同时还将了解数据类型的更多细节,并结识一个新朋友:make。
简明数据类型指南 162
勿以小杯盛大物 163
使用类型转换把float值存进整型变量 164
不好啦,兼职演员来了…… 168
代码到底怎么了 169
编译器不喜欢惊喜 171
声明与定义分离 173
创建第一个头文件 174
如果有共同特性…… 182
把代码分成多个文件 183
编译的幕后花絮 184
共享代码需要自己的头文件 186
又不是造火箭……还真是! 189
不要重新编译所有文件 190
首先,把源代码编译为目标文件 191
记不住修改了哪些文件 196
用make工具自动化构建 198
make是如何工作的 199
用makefile向make描述代码 200
火箭升空! 205
C语言工具箱 206
5 结构、联合与位字段
创建自己的结构
生活可比数字复杂多了。
到目前为止,你只接触过C语言的基本数据类型,但如果想表示数字、文本以外的其他东西呢,或为现实世界中的事物建立模型,怎么办?结构将帮你创建自己的结构,模拟现实世界中错综复杂的事物。在本章中,你将学习如何把基本数据类型组成结构以及用联合处理生活的不确定性。如果你想简单地模拟“是”或“非”,可以用位字段。
有时要传很多数据 218
窃窃私语 219
用结构创建结构化数据类型 220
只要把“鱼”给函数就行了 221
使用“.”运算符读取结构字段 222
结构中的结构 227
如何更新结构 236
代码克隆了乌龟 238
你需要结构指针 239
*t.age和*t.age 240
同一类事物,不同数据类型 246
联合可以有效使用存储器空间 247
如何使用联合 248
枚举变量保存符号 255
有时你想控制某一位 261
位字段的位数可调 262
C语言工具箱 266
6 数据结构与动态存储
牵线搭桥
一个结构根本不够。
为了模拟复杂的数据需求,通常需要把结构链接在一起。在本章中,你将学习如何用结构指针把自定义数据类型连接成复杂的大型数据结构,将通过创建链表来探索其中的基本原理;同时还将通过在堆上动态地分配空间来学习如何让数据结构处理可变数量的数据,并在完成工作后释放空间;如果你嫌清理工作太麻烦,可以学习一下怎么用valgrind。
保存可变数量的数据 268
链表就是一连串的数据 269
在链表中插入数据 270
创建递归结构 271
用C语言创建岛屿…… 272
在链表中插入值 273
用堆进行动态存储 278
有用有还 279
用malloc申请存储器…… 280
用strdup修复代码 286
用完后释放存储器 290
SPIES系统综述 300
软件取证:使用valgrind 302
反复使用valgrind,收集更多证据 303
推敲证据 304
最终审判 307
C语言工具箱 309
7 高级函数
发挥函数的极限
基本函数很好用,但有时需要更多功能。
到目前为止,你只关注了一些基本的东西,为了达成目标,需要更多的功能与灵活性。本章你将学习如何把函数作为参数传递,从而提高代码的智商,
并学会用比较器函数排序,最后还将学会使用可变参数函数让代码伸缩自如。
寻找真命天子…… 312
把代码传给函数 316
把函数名告诉find 317
函数名是指向函数的指针…… 318
……没有函数类型 319
如何创建函数指针 320
用C标准库排序 325
用函数指针设置顺序 326
分手信自动生成器 334
创建函数指针数组 338
让函数能伸能缩 343
C语言工具箱 350
8 静态库与动态库
热插拔代码
你已经见识过标准库的威力。
是时候在代码中发挥这种威力了。在本章中,你将学会创建自己的库,以及在多个程序中复用相同代码;还将掌握编程大师的秘诀——通过动态库在运行时共享代码;最后你将写出易于扩展并可以有效管理的代码。
值得信赖的代码 352
尖括号代表标准头文件 354
如何共享代码? 355
共享.h头文件 356
用完整路径名共享.o目标文件 357
存档中包含多个.o文件 358
用ar命令创建存档 359
最后编译其他程序 360
Head First健身房全球化战略 365
计算卡路里 366
事情可没那么简单…… 369
程序由碎片组成…… 370
在运行时动态链接 372
.a能在运行时链接吗? 373
首先,创建目标文件 374
一种平台一个叫法 375
C语言工具箱 387
9 进程与系统调用
打破疆界
打破常规。
你已经学会了通过在命令行连接小工具的方式建立复杂的程序。但如果你想在代码中使用其他程序怎么办?本章中你将学会如何用系统服务来创建和控
制进程,让程序发电子邮件、上网和使用任何已经安装过的程序。本章的最后,你将得到超越C语言的力量。
操作系统热线电话 398
黑客入侵了…… 402
岂止是安全问题 403
exec给你更多控制权 404
exec函数有很多 405
数组函数:execv、execvp、execve 406
传递环境变量 407
大多数系统调用以相同方式出错 408
用RSS读新闻 416
exec是程序中最后一行代码 420
用fork+exec运行子进程 421
C语言工具箱 427
10 进程间通信
沟通的艺术
创建进程只是个开始。
如果你想控制运行中的进程,向进程发送数据或读取它的输出,该怎么办?通过进程间通信,进程可以合力完成某件工作。我们将向你展示如何让程序与系统中其他程序通信,从而提升它的战斗力。
输入输出重定向 430
进程内部一瞥 431
重定向即替换数据流 432
fileno返回描述符号 433
有时需要等待…… 438
家书抵万金 442
用管道连接进程 443
案例研究:在浏览器中打开新闻 444
子进程 445
父进程 445
在浏览器中打开网页 446
进程之死 451
捕捉信号然后运行自己的代码 452
用sigaction来注册sigaction 453
使用信号处理器 454
用kill发送信号 457
打电话叫程序起床 458
C语言工具箱 466
11 网络与套接字
金窝,银窝,不如127.0.0.1的草窝
不同计算机上的程序需要对话。
你已经学习了怎么用IO与文件通信,还学习了如何让同一台计算机上的两个进程通信,现在你将走向世界舞台,让C程序通过互联网和世界各地的其他程序通信。本章的最后你将创建具有服务器和客户端功能的程序。
互联网knock-knock服务器 468
knock-knock服务器概述 469
BLAB:服务器连接网络四部曲 470
套接字不是传统意义上的数据流 472
服务器有时不能正常启动 476
妈妈说要检查错误 477
从客户端读取数据 478
一次只能服务一个人 485
为每个客户端fork一个子进程 486
自己动手写网络客户端 490
主动权在客户端手中 491
创建IP地址套接字 492
getaddrinfo获取域名的地址 493
C语言工具箱 500
12 线程
平行世界
程序经常需要同时做几件事。
POSIX线程可以派生几段并行执行的代码,从而提高代码的响应速度。但是要小心!线程虽然很强大,但它们之间可能发生冲突。本章你将学习如何用红绿灯来防止代码发生车祸。最终你将学会创建POSIX线程,并使用同步机制来保护共享数据的安全。
任务是串行的……还是…… 502
……进程不是唯一答案 503
普通进程一次只做一件事 504
多雇几名员工:使用线程 505
如何创建线程? 506
用pthread_create创建线程 507
线程不安全 512
增设红绿灯 513
用互斥锁来管理交通 514
C 语言工具箱 521
i 饭后甜点
十大遗漏知识点
革命尚未成功,同志还需努力。
我们认为你还需要知道一些事,如果不讲,总觉得哪里不对劲,但我们又不希望这本书重得只有大力士才提得动,所以我们只做简单介绍。在你放下这本书前,尽情地享用这些“美味佳肴”吧。
#1. 运算符 540
#2. 预处理指令 542
#3. static关键字 543
#4. 数据类型的大小 544
#5. 自动化测试 545
#6. 再谈gcc 546
#7. 再谈make 548
#8. 开发工具 550
#9. 创建GUI 551
#10. 参考资料 552
ii 话题汇总
总复习
将C语言的特性尽收眼底。
我们把本书中出现过的所有关于C语言的话题和原理都汇总在了这里。把它们过一遍,看你还记得多少。每条话题都标明了来源章节号。如果你想不起来,很容易就能找到原文,甚至还可以把它们剪下来贴在墙上。
內容試閱 :
【译者序】
1969年“阿波罗11号”登月成功。贝尔实验室中一个叫Ken
Thompson的年轻人为了一圆翱游太空的梦想,在当时的Multics①系统上写了一个叫《星际之旅》的游戏。但当时大型机的机时费很贵,每玩一次公司就要为此支付75美金,于是Thompson打起了小型机PDP-7的主意。但当时的PDP-7只有一个简陋的运行时系统,不支持多用户,为了能双人对战,Thompson找来Dennis
Ritchie一起开发新的操作系统。
他们只花了一个月的时间就用汇编语言写出了操作系统的原型。同事Peter
Neumann看到后,戏称这个系统为Unics②。Unix这个名字典出于此。
1971年,第一版的Unix已经能够支持两名用户在PDP-11上玩《星际之旅》了,但因为当时的Unix是用汇编语言写的,无法移植到其他机器上,所以他们决定用高级语言重写Unix,可当时的高级语言无论从运行效率还是功能上都无法满足他们的需要。Thompson先是在BCPL的基础上萃取出了B语言,Ritchie又在B的基础上进行了重新设计,这才有了今天大名鼎鼎的C语言。
而现在你手上的就是一本关于C语言的书。
本书分为三个部分。
● 第1章到第4章是基础知识,包括基本语法、指针、字符串、小工具与源文件。
● 第5章到第8章为进阶内容,有结构、联合、数据结构、堆、函数指针、动静态链接。
● 最后四章是高级主题,内容涵盖了系统调用、进程间通信、网络编程和多线程。
每部分结束后还用一个实验来提高读者的动手能力。
本书最大的特点是每次在引出新概念前都会先提出一个问题,让读者在知道怎样做(how)之前先知道为什么这么做(why),并在解决问题的过程中不断提出新问题,让读者去解决,从而加深理解;书中还设有很多“问答”环节,提出并回答了一些读者在学习过程中可能会遇到的问题。除此之外,作者还使用了大量拟人手法,例如让编译器化身公众人物在访谈节目中现身说法,抑或让静态库和动态库对簿公堂。谈笑风生间,它们的特点,跃然纸上。无论你是音乐发烧友、推理迷,还是填字游戏爱好者,都可以在这本书中找到吸引你的元素。
两个改变世界的发明起初不过是为了一个游戏,从这个角度看,这本同样趣味十足的《嗨翻C语言》,能否算是对于这种精神的一种延续呢?
① Multics全称为MULTiplexed Information and Computing
System(多路信息计算系统)是1964年由贝尔实验室、MIT和通用电气共同研发的一套安装在大型机上的多人多任务操作系统。因为工作进度缓慢,贝尔实验室于1969年退出该计划。
② 意思是UNiplexed Information and Computing
System(单路信息计算系统),用来影射Multics。
我在翻译的过程中力求真实传达作者的意图,无论是一个技术上的概念还是一段幽默。为了减轻阅读压力,我还将书中部分代码中的字符串也译为了中文,希望不是画蛇添足。
最后,感谢王琛、邱瑀庭等好友提出的建议;感谢作者David
Griffiths耐心解答我提出的每一个问题。感谢图灵的李洁、李松峰、傅志红老师以及各位审读老师提供的帮助与支持。
程亦超
2012年12月17日