-
病毒技术日新月异,反毒公司疲于应付,不过也可以估计一下发展方向,制定好“5年计划”。不了解矛的特点就不能制造出好的盾。矛有多种:直矛、弯矛,独矛、多矛,尖矛、钝矛……同样,盾有多种:平盾、凸盾、凹盾、三角盾……
凭 着对网络的第六感,我对病毒的发展方向做了一下估想。说明一下,我什么技术都不会,编程也全部忘记了。所以下面的设想可能在技术上很难实现。不过我一直认 为创意先于技术。你可以把下面的话看做是在说梦话,反正人生如梦。本人不对有人用下面创意搞破坏负责。因为这正如网络安全知识:是矛也是盾。
浩写于2004.2.16~3.10首发于浩的个人网站:www.caiyihao.com,转载请保留作者信息,谢谢!
由于现在已经是网络普及,是蠕虫才扩散速度快,所以下面谈论的基本都是网络蠕虫病毒。
一、 自动升级病毒:杀毒软件有自动升级功能,呵呵,病毒就不可以有么,升级的好处:1.病毒作者可根据病毒蔓延情况,抢先在杀毒软件前更新病毒。2.而且,可 以随时改变攻击对象,例如DOS拒绝服务攻击网站的对象,现在的病毒基本都是一次写就攻击对象的,如为微软网站。如果可以改变DOS拒绝服务对象,那么对 方网站基本难以事先准备。3.可以对编码出错处修改和优化代码。4.升级病毒能避免高版本病毒要再放出来再感染多一次机器。这样的话避免相同工作,传播速 度更快。
升级方式:1.特定网站放文件升级,病毒自动下载文件升级。这样很容易病毒网站流量太大瘫痪,实际上就是DOS攻击了,不太实际。
2.特定网页升级,通过读出网页里面特定位置的代码,把它下到自身病毒用本身的引擎进行升级,流量问题和上面差不多。
3.版本不同升级,高版本病毒通过开后门,在机器留一个文件,甚至一个网页,低版本病毒通过扫描,发现另外一部机器有高版本病毒,马上到那里得到升级代码或文件。升级后病毒在自己机器也放一个升级文件。这样的话速度很快的,所以所有病毒很快全部升级。
4.e-mail 升级,和上面相类似,只不过现在用自己带或者是系统带的mail引擎系统收发升级代码或文件。
二、系统还原病毒:就是和现在的系统还原软件一样道理,感染后,你杀了以后重新开机又复了中毒时候的状态。缺点是现在的系统还原软件体积很大,可以考虑把系统还原软件减去一些功能,例如,保护病毒本身就可以,或者几个重要文件夹就可以,同时不让杀毒软件更新。
三、像杀毒软件的病毒:表面看是杀毒软件,实际上不是,可以从图标方面入手,或者是双后缀名入手。
四、专门杀杀毒软件的病毒:我想将来病毒应该并非像现在的进程、特征码、文件杀杀毒软件。而应该是特征行为杀,杀病毒可以从特征行为杀,倒过来杀杀毒软件也可以。或者是杀毒软件的特征码杀,呵呵。
五、 破坏硬件的病毒:其实即使是CIH也是应该叫破坏软件。现在主板都可以在系统环境下刷新了,可以考虑软件控制bios的设置,让某些设置不合理,严重损耗 硬件。也可以通过严重数字计算使CPU产生热量,或者提高刷新频率破坏显卡和显示器,或者不停狂读写硬盘某区损坏硬盘和磁头,或者是突然提高声音音量震坏 音箱。
六、寄生病毒:生物世界有寄生病毒,电脑世界也可以。寄生病毒的特点是寄生在已经广泛传播感染了机器的病毒上,这样传播速度很快。多、快、好、省。
本文由caiyihao(浩)写,由于以前我的文章给人家转载过程有时删除掉一些内容,所以完整内容和后继修改请访问浩的个人网站:www.caiyihao.com
七、权限病毒:与杀毒软件争权限,把杀毒软件权限降低,自己权限提升。
八、手机病毒泛滥:现在都有一些手机病毒了,将来应该可以有病毒狂发短信、狂定业务、刷手机bios,烧主板、狂打电话、列黑名单让好友打不进来、或者是打了一段时间就断。或者变声变调,男人声音变成女人声音。
九、恶意病毒:以阻塞网络、产生垃圾消息等网络流氓行为为目的。或者是突然出现一个鬼叫大声吓死心脏病人,没有心脏病也给它吓出心脏病来的这么一类。
十、假冒病毒公告:最近的病毒都能假冒e-mail的系统退信骗过用户。最近很多e-mail的系统都有发e-mail给用户提示最新病毒情况。可以假冒。病毒设计本来就应该结合社会工程学。和社会工程学结合才传播速度快,人是社会的人,不能脱离社会。
……(内心极烦闷,无心思再写,见谅)
对病毒公司的一些个人看法:
虽然以前人家说有一些病毒是病毒公司特意写了放出来,我不同意这个说法,其实真正有大危害的是都只是那几个出名病毒,这些病毒理论上应该不是什么公司写的,而是个人。现在公司的拦截也快,这个公司和另外公司对同一个病毒拦截一般也不超过几个小时。
我 想国内的病毒公司应该多在公益方面下功夫,不要只是注意到钱,看看外国那些大的安全公司,一般有流量实时图。一个病毒公司的定位固然不能不考虑到钱,但什 么都绕钱转不行,互联网的开放、自由性那么强,公司力量再大也有限,不如个人共同结合起来大。正如如果一个医生看病想着赚药费,不会成为一个好医生。
我 想没有必要把一个病毒说的天花乱坠,就好像以前的CIH病毒一样,宣传的人人都怕,这样公司就可以多卖软件。如果说一个删除硬盘的可执行文件都可以叫病 毒,那么基本人人都可以写病毒。不是严重的就让它不那么吓人吧。病毒公司应该是在培养人养成良好防毒工作的宣传上面下功夫。
我记得我两年前和*山杀毒公司的一个软件设计员QQ聊天过,他说他们公司写那个杀毒软件才六个人。很难想象一个销量这么大的软件可以这么少人来写,不说bug,单单是思维,人多比人少考虑的问题多吧。
……(内心极烦闷,无心思再写,见谅)
浩写于2004.2.16~3.10首发于浩的个人网站:www.caiyihao.com,转载请保留作者信息,谢谢! -
2005-05-20
Internet上的域名服务器安全(转载) - [computer]
-
2005-04-01
被微软“深度隐藏”的文件 - [computer]
我知道已经有人开始意识到我所提的这些方面.但是我确信绝大部分的人不知道这一切.这篇指南的目的是告诉大家微软的产品究竟干了些什么以及如何从微软的手中重新获得我们自己的隐私权.感谢阅读此文.
声明:
声明:
作者(译者)不对任何由读者自己造成或者由于其他原因造成的损失和信息丢失负责.
概要:
在你的计算机里有很多微软试图隐藏的文件目录.在这些目录中你会(主要)发现有这样两种东西:Microsoft Internet Explorer记录了你所访问过的所有站点---即使你已经清空了你的缓存,Microsoft Outlook和Microsoft Outlook Express记录了你所有的E-MAIL信息--即使你已经从垃圾箱中把他们清除(其中也包括来往信件中的附件).请相信我,我所说的还不到实际的 50%.
我之所以说这些文件都隐藏得很好,是因为他们确实隐藏得非常好.以至于如果你没有什么DOS的知识,那你就不可能找到这些东西. 我之所以这么说是因为其中有些文件只能在DOS或只能在Windows Explorer里显示.还有些文件在DOS和Windows里都不能显示,但是可以通过一个特定的工作环境来显示他们.基本上以下我所提到的东西如果你 并不事先知道他们的存在,那么在日常的使用过程中遇到他们的机会是微乎其微的.
为了向你们展示这些隐藏的文件是多么的卑鄙,我举个简单的例 子,其中有三个隐藏的文件夹包括了:你的姓名,地址,电话号码,你所访问过的网站,你所发出或 接受到的每一封E-MAIL,你所发出或接受到的每一个附件,你通过搜索引擎所查找的每一个关键字,你所下载的每一个文件名,包含有"敏感"信息的文档 名,你的所有Cookies的副本,来自你的HOTMAIL账户的完全可读的E-MAIL,你的PGP密匙,还有更多...
有趣的是以上的所有在microsoft的官方网站上却只字未提.
作者(译者)不对任何由读者自己造成或者由于其他原因造成的损失和信息丢失负责.
概要:
在你的计算机里有很多微软试图隐藏的文件目录.在这些目录中你会(主要)发现有这样两种东西:Microsoft Internet Explorer记录了你所访问过的所有站点---即使你已经清空了你的缓存,Microsoft Outlook和Microsoft Outlook Express记录了你所有的E-MAIL信息--即使你已经从垃圾箱中把他们清除(其中也包括来往信件中的附件).请相信我,我所说的还不到实际的 50%.
我之所以说这些文件都隐藏得很好,是因为他们确实隐藏得非常好.以至于如果你没有什么DOS的知识,那你就不可能找到这些东西. 我之所以这么说是因为其中有些文件只能在DOS或只能在Windows Explorer里显示.还有些文件在DOS和Windows里都不能显示,但是可以通过一个特定的工作环境来显示他们.基本上以下我所提到的东西如果你 并不事先知道他们的存在,那么在日常的使用过程中遇到他们的机会是微乎其微的.
为了向你们展示这些隐藏的文件是多么的卑鄙,我举个简单的例 子,其中有三个隐藏的文件夹包括了:你的姓名,地址,电话号码,你所访问过的网站,你所发出或 接受到的每一封E-MAIL,你所发出或接受到的每一个附件,你通过搜索引擎所查找的每一个关键字,你所下载的每一个文件名,包含有"敏感"信息的文档 名,你的所有Cookies的副本,来自你的HOTMAIL账户的完全可读的E-MAIL,你的PGP密匙,还有更多...
有趣的是以上的所有在microsoft的官方网站上却只字未提.
索引:
1.定义和缩写
2.你为什么要删除这些文件
3.如何尽快的删除这些文件(推荐给非专业人士)
3.1如果你使用Microsoft Internet Explorer
3.2清理你的注册表
3.3如果你使用Microsoft Outlook Express
3.4彻底删除文件
3.5继续使用Microsoft Internet Explorer(强烈不推荐)
4.逐步带你走近这些隐藏的文件(推荐给专业人士)
5.看看OUTLOOK的真正面目
6.微软是如何做到这些的
7.+s代表隐秘而不是系统
8.FIND FAST的真正面目
8.1删除FIND FAST
9.看看微软为了防止人们发现这些隐藏的文件而尽了多大的努力
10.最终注解和联系方式
10.1推荐阅读
11.特别鸣谢
12.参考联接
--------------------------------------------------------------------------------
1.定义和缩写
我所提出的最好的定义就是以下这个:
I)所谓的"深度隐藏"的文件/文件夹就是在你选择了"显示所有文件"选项的时候依然不能被Windows Explorer所显示,也不能在MS-DOS列文件目录时被显示,同样不能通过"查找"来找到的这样的文件/文件夹.
a)必须通过最少一个工作环境来使Explorer可以显示他们(深度隐藏文件/文件夹)
b)必须通过最少一个工作环境来使MS-DOS可以显示他们(深度隐藏文件/文件夹)
c)必须通过最少一个工作环境来使"查找"可以找到他们(深度隐藏文件/文件夹)
d)他们是被蓄意隐藏的.
II)要把"深度隐藏"的文件/文件夹同简单的加上h(隐藏属性)的文件/文件夹(如MS DOS.SYS或SYSBCKUP文件夹)区分开来.
III)要把"深度隐藏"的文件/文件夹同"其他"的一些故意隐藏的文件(如一个文件名为????x¥.的文件)区分开来.
DOS = 磁盘操作系统
MSIE = Microsoft Internet Explorer
TIF = Temporary Internet Files (folder) (临时Internet文件/文件夹)
HD = 硬盘
OS = 操作系统
--------------------------------------------------------------------------------
2.我为什么要删除这些文件?
1)因为这明显涉及到你的隐私安全问题
2)因为微软是蓄意的要保留这些记录(至于原因,我只能进行猜测)
3)因为这些文件占用了大量的磁盘空间,我曾经发现一台计算机里有200兆的空间被这样的文件所占用,这下你可以明白究竟是什么使你的计算机越来越慢了.在按照以下的措施进行过以后你可能会发现你的计算机的性能得到了巨大的提升.
--------------------------------------------------------------------------------
3.如何尽快的删除这些文件
这部分将逐步地讲述如何尽快的删除这些文件.这个部分推荐给非专业人士.而进一步的研究将在第4部分中讨论,请注意以下的步骤将删除你的所有缓存文件,所有cookie文件,所有E-MAIL信息.如果你正在使用MSIE的脱机浏览功能的话,这些脱机文件也将被删除.
--------------------------------------------------------------------------------
3.1如果你使用Microsoft Internet Explorer
1)先关闭你的计算机,再重新开机.
2)在你的计算机开机过程中按F8键直到你看见一个选择菜单
3)选择"命令行模式"(这将使你进入实DOS模式)
4)在你的计算机启动完毕后你将看见C:>_,然后输入以下的命令在每行的结尾按"回车"键
CD\WINDOWS\TEMPOR~1
DELTREE/Y CONTENT.IE5
如果以上的命令无效,则输入以下命令
CD\WINDOWS\APPLIC~1\TEMPOR~1
DELTREE/Y CONTENT.IE5
如果以上的命令仍然无效,则输入以下命令
CD\WINDOWS\LOCALS~1\TEMPOR~1
DELTREE/Y CONTENT.IE5
如果你确信你使用的是MSIE,且上面的步骤都无效,那么请发E-MAIL给我.找到这个文件夹的位置是我的任务,我对于MSIE爱把自己的缓存藏在什么地方非常感兴趣.我知道更低版本的MSIE通常把缓存放在"C:\WINDOWS\CONTENT"内.
5)这个通常会花费一个相当长的时间来完成上面的删除.删除的时间越长,微软记录的你的个人信息就越多.上面的操作完成后,再进行以下操作:
CD\
DELTREE/Y TEMP
DELTREE/Y WIN386.SWP
CD\WINDOWS
DELTREE/Y COOKIES
DELTREE/Y TEMP
DELTREE/Y WIN386.SWP
DELTREE/Y HISTORY
--------------------------------------------------------------------------------
3.2清理你的注册表
重启你的计算机,等待WINDOWS装载完毕
1)进入DOS("开始">"所有程序">"命令提示符(MS-DOS Prompt)"在命令行敲入以下命令:
regedit
2)这时会显示注册表编辑器,选择"编辑">"查找".
3)输入"TypedURLs"然后点"查找下一个".你将会被带到一个你所手工输入的所有联接的地方.
4)删除你所找到的所有联接.不要删除文件夹(如"01","02","03"等),在找到的键值上双击以确认他们确实是联接,我所找到的我的键值如下:
HKEY_USERS/Default/Software/Microsoft/Internet Explorer/TypedURLs/
HKEY_CURRENT_USER/Software/Microsoft/Internet Explorer/TypedURLs/
5)在注册表编辑器里你找到这个键值:
HKEY_LOCAL_MACHINE/Software/Microsoft/Windows/CurrentVersion
/Explorer/RemoteComputer/NameSpace/{d6277990-4c6a-11cf-8d87-00aa0060f5b5}
6)删除键值{d6277990-4c6a-11cf-8d87-00aa0060f5b5}这会使你的"查找:文件或文件夹"程序运行更加快速.
--------------------------------------------------------------------------------
3.3如果你安装了OUTLOOK或OUTLOOK EXPRESS
1)安装一个第三方的E-MAIL管理程序如:Eudora或者Pegasus Mail.(译者注:中国人推荐使用FOXMAIL)并且确保安装正确完成.
2)备份你所想要保存的所有E-MAIL(打印出来,或者把他们发送到其他的电子邮箱)
3)卸载OUTLOOK
警告: 按照上面的步骤就不会损失你的任何E-MAIL信息,再次核对后返回命令行(DOS prompt),继续输入以下命令:
dir *.mbx /s/p
dir *.mbx /s/p/ah
你将会看到如下的文件:
INBOX.MBX
OUTBOX.MBX
SENTIT~1.MBX
DELETE~1.MBX
DRAFTS.MBX
如果显示了这些文件,这些文件必然存在于以下的这些目录中的任何一个:
C:\WINDOWS\APPLICATION DATA\MICROSOFT\OUTLOOK EXPRESS\MAIL
C:\PROGRAM FILES\INTERNET MAIL或NEWS\%USER%\MAIL
(如果这些.mbx文件存在于其他的位置,那么你最好不好删除他们,因为这些文件不是来自OUTLOOK的.如果你确定他们确实同样来自OUTLOOK,请发E-MAIL给我.)
接下来输入以下命令中的一组(取决于你的.mbx文件的位置).记住,这会删除你的所有E-MAIL信息,所以如果你想要保留你的E-MAIL信息请事 先打印出来或转发至其他的电子邮箱.此时你可以使用你已经安装的Eudora或Pegasus Mail(译者注:FOXMAIL).
CD\WINDOWS\APPLIC~1\MICROS~1\OUTLOO~1
DELTREE/Y MAIL
或
CD\PROGRA~1\INTERN~1\%USER% (用你的用户名来替换%USER%)
DELTREE/Y MAIL
--------------------------------------------------------------------------------
3.4彻底删除你的文件
也许你早就知道,删除文件只是删除指向这个文件的索引. 事实上你所删除的文件依然存在于你的硬盘上, 任何人都可以很轻松的恢复他. BCWipe是一个用来彻底删除文件的很好的程序. 如果你使用DOS, FileDust是一个曾在ZDNET上获得5星的可以完成这个任务的很好的程序. 如果你使用PGP,那在PGPtools里你会发现有一个"Freespace Wipe"的选项. Norton Utilities里也包括了一个很好的彻底删除文件的程序. 你也可以通过拥有30天的试用期来使用Evidence Eliminator, 这可能是确保你的隐私的最好的程序了.
--------------------------------------------------------------------------------
3.5继续使用Microsoft Internet Explorer
如果你坚持继续使用Microsoft Internet Explorer,那么我推荐你至少要具备以下程序中的一个:
PurgeIE
Anonymizer Window Washer
Cache and Cookie Washer for IE
我也曾经尝试和测试了同类的其他的一些程序,如果你知道他们当中不能通过测试的数目, 你可能会大跌眼镜的. 譬如, HistoryKiller 2001宣称他可以清除所有的文件, 但是我奉劝你们不要相信他.
--------------------------------------------------------------------------------
4.逐步带你走近这些隐藏的文件
以下的这个部分是为那些对自己计算机的细节部分感兴趣的读者准备的.此部分适用于专业人士.
1)首先,进入DOS模式,在命令行输入以下的命令(全部以小写形式):
c:\windows\explorer /e,c:\windows\tempor~1\content.ie5
你看到那些在"content.ie5"目录下以数字和字母命名的文件了么?这是微软试图通过使用复杂的文件名来使他的计划越发难以理解.(早期版本的 IE仅以"cache#."来命名)这些数字和字母命名的文件夹就是微软生成的用来保存你的cookies和缓存的文件夹.把他们的名字记下来(他们应该 是如此类的样子:6YQ2GSWF, QRMTKLWF, U7YHQKI4, 7YMZ516U, WQK6Z9UV等)如果你在其中任何以个文件夹上双击,什么都不会显示出来,这并不代表着里面没有任何的文件,而是Windows Explorer向你撒谎了.如果你真的想知道这些数字和字母命名的文件夹内的内容,那只能在DOS下面实现了(其实,Skywalker曾教过我一个使 用工作环境来查看其内容的方法,但是有点难以用语言来解释清楚,我承诺会在下一个版本中说清楚这个方法.)
2)重启进入MS-DOS模式(你之所以要重启是因为windows"锁定"了其中的一些文件)
3)在命令行输入以下命令:
CD\WINDOWS\TEMPOR~1\CONTENT.IE5
CD %alphanumeric%
(用你刚才所记下的第一个名字来替换%alphanumeric%)
DIR/P
注意:你现在进入了一个DOS宣称并不存在的目录,而在这个目录中存放了Windows Explorer宣称并不存在的缓存和cookies.(译者注:说谎的Microsoft!)
这些目录就是你发现的硬盘空间减少之谜的直接原因.也许你会发现其中存在一些很有趣的东西:
你所访问过的所有色情网站的图片(译者注:我的计算机里可没有啊 )和其他一些完全是在浪费你的硬盘空间的Internet临时文件如果你使用HOTMAIL(或其他一些页面邮件服务系统),你可以看到你的一些旧信息就 存放在那里,如果自己想再次浏览他们,只要把他们拷贝到其他的目录 然后用你的浏览器打开就可以了.从这些cookies中重新获得你的个人信息非常容易.譬如,你曾经在Amazon.com购过物,那么这里就有你的姓名 和E-MAIL,如果你是Hollywood.com的一个用户,那么这里就有你的城市,国家和邮编MP3.com也保留了类似的信息.那么在进行下一步 骤之前,慢慢享受这些由数字和字母命名的文件夹带给你的"乐趣"吧.
4)输入以下命令:
CD\WINDOWS\TEMPOR~1\CONTENT.IE5
EDIT /75 INDEX.DAT (或者 "EDIT /16 index.dat"
你将会看到一个充满二进制串的蓝色编辑界面.
5)按住"Page Down"直到你开始看到一些联接的列表.
这些都是你曾经访问过的站点及这些站点的摘要.除了这些联接外,你还会发现他甚至以纯文本的形式纪录了你在搜索引擎所输入的每一个关键字.
6)在你搜索完毕后,你可以选择"File">"Exit"来退出.
下面你可以通过输入以下命令来删除这些文件:
7)DELTREE/Y C:\WINDOWS\TEMPOR~1
(如果你的TIF文件夹不是C:\WINDOWS\TEMPOR~1的话,就用正确的来替换他)
以上这个操作可能也会花费相当长的一段时间,当你完成后,我们来看看你的历史纪录吧.
8)输入以下命令:
CD\WINDOWS\HISTORY\HISTORY.IE5
EDIT /75 INDEX.DAT (或者 "EDIT /16 index.dat"
你将会再次看到一个充满二进制串的蓝色编辑界面.
9)按住"Page Down"直到你开始看到一些联接的列表.这些是你曾经访问过的站点的另一个记录.这里可能还存有其他一些东西,如果你还看到什么有意思的东西,你可以发E-MAIL给我.现在我将与你分享一些来自我的index.dat里的片段.
Client UrlCache
MMF Ver 5.2@<!--[if !supportFootnotes]-->[1]<!--[endif]-->
@<!--[if !supportFootnotes]-->
--------------------------------------------------------------------------------
<!--[endif]-->3yia
€
àOD ê:+0
0?
‘?
}*á? 5.t
xt<!--[if !supportFootnotes]-->
--------------------------------------------------------------------------------
<!--[endif]-->
59
<!--[if !supportFootnotes]-->
--------------------------------------------------------------------------------
<!--[endif]-->
MS6C:%
<!--[if !supportFootnotes]-->[1]<!--[endif]-->\DAVE'S
HD.TXT
MSIE5.
C:
你注意到"C:"和"\DAVE'S HD\MSIE5.TXT"了么?
"DAVE"是我计算机里我的用户名,"DAVE'S HD"是我的局域网中的根文件夹.而"MSIE5.TXT"是我计算机里存放的一个文本文件的文件名,其中包含的就是我这项研究的结果,主要是一些联接和注释.
你看到这个场面你发现有什么不对劲的了么?天啊!他竟然会对我的硬盘里的文件做手脚!,不光如此,而且他还把这个文件存放在一个即不能用DOS也不能用Windows Explorer发现的地方.这个文件又与我的这个研究相关,难道这仅仅是巧合么?!
显然,我的第一个假设就是微软扫描我的硬盘记录任何包含"敏感"字符的信息.在上面的这个例子里,可能是我的"MSIE5.TXT"中包含了一些微软不愿意看到的东西,想要知道我又发现了什么,请参考第8部分"FIND FAST的真正面目".
1)如果这时你还耐着性子看我的文章,那么就输入以下的命令:
CD\WINDOWS\HISTORY
2)找出这些mmXXX.dat(删除他们),再输入以下命令:
CD\WINDOWS\HISTORY\HISTORY.IE5
CD MSHIST~1
EDIT /75 INDEX.DAT (或者 "EDIT /16 index.dat" )
你会发现这里有更多你internet历史记录,注意可能这里还有其他的一些mshist~x文件夹.
3)你可以对发现的每一个mshistxx文件重复以上的步骤.
4)看到这你可能忍无可忍的想删除些什么了,那么输入以下的命令:
CD WINDOWS
DELTREE/Y HISTORY
我所知道的就这么多了,如果你使用Outlook的话,你可以再检查一下你的*.mbx文件(dir *.mbx/s),在下一章节我们将更加深入的继续我们的讨论.
--------------------------------------------------------------------------------
5.看看OUTLOOK EXPRESS的真正面目
好好想想如果你的所有的E-MAIL信息都被暗中的记录下来的话,你会怎么说?E-MAIL记录保留了你所说的一切记录,即使你已经使用OUTLOOK 来 进行过删除操作.你被OUTLOOK蒙骗了,以为自己进行过2次删除,那么那些信息就理应彻底的从这个世界里消失了.首先,OUTLOOK先将你的删除的 文件移到一个"删除的项目"文件夹中,在你清空这个文件夹的时候,OUTLOOK只是"假装"你要删除的文件真正的从你的计算机里被物理删除了,而事实 是,你所删除的文件只是被暗中存放在一个"深度隐藏"的文件夹中.
更有甚者,OUTLOOK EXPRESS还将你的每一个E-MAIL的附件的信息暗中存放在一个加过密的数据库内.天啊!你能相信这是真的么?!
我们来做一个试验,我将一个ZIP文件作为附件发送给我自己的电子邮箱.
PK<!--[if !supportFootnotes]-->
--------------------------------------------------------------------------------
<!--[endif]--><!--[if !supportFootnotes]-->
--------------------------------------------------------------------------------
<!--[endif]-->'...?*}??P<!--[if !supportFootnotes]-->
--------------------------------------------------------------------------------
<!--[endif]-->AAA-à?€ ??-83PK<!--[if !supportFootnotes]-->
--------------------------------------------------------------------------------
<!--[endif]--><!--[if !supportFootnotes]-->
--------------------------------------------------------------------------------
<!--[endif]-->+...?*8?M3P
<!--[if !supportFootnotes]-->
--------------------------------------------------------------------------------
<!--[endif]-->BBB-à?€ ×?%-83PK<!--[if !supportFootnotes]-->
--------------------------------------------------------------------------------
<!--[endif]--><!--[if !supportFootnotes]-->
--------------------------------------------------------------------------------
<!--[endif]-->....?*??.?P<!--[if !supportFootnotes]-->
--------------------------------------------------------------------------------
<!--[endif]-->CCC-à?€ ??!-83PK<!--[if !supportFootnotes]-->
--------------------------------------------------------------------------------
<!--[endif]-->
<!--[if !supportFootnotes]-->
--------------------------------------------------------------------------------
<!--[endif]-->2...?*2?`P<!--[if !supportFootnotes]-->
--------------------------------------------------------------------------------
<!--[endif]-->DDD-à?€ ù?-83PK<!--[if !supportFootnotes]-->[1]<!--[endif]-->
'...?*}??P<!--[if !supportFootnotes]-->
--------------------------------------------------------------------------------
<!--[endif]-->
AAAPK<!--[if !supportFootnotes]-->[1]<!--[endif]-->+...?*8?M3P
<!--[if !supportFootnotes]-->
--------------------------------------------------------------------------------
<!--[endif]--> 1BBBPK<!--[if !supportFootnotes]-->[1]<!--[endif]-->
....?*??.?P<!--[if !supportFootnotes]-->
--------------------------------------------------------------------------------
<!--[endif]--> bCCCPK<!--[if !supportFootnotes]-->[1]<!--[endif]-->2...?*2?`P
<!--[if !supportFootnotes]-->
--------------------------------------------------------------------------------
<!--[endif]-->
"DDDPK<!--[if !supportFootnotes]-->
--------------------------------------------------------------------------------
<!--[endif]--><!--[if !supportFootnotes]-->
--------------------------------------------------------------------------------
<!--[endif]-->??
这样这个文件的信息就在我的inbox.mbx和outbox.mbx文件中都有记录了.
UEsDBBQAAAAIACeFjip9jZkaEAAAAFAAAAADAAAAQUFBrcCBAAAAAIAg1vgpljizAFBLAwQUA AAACAArh
Y4qOPhNMxAAAABQAAAAAwAAAEJCQq3AgQAAAACAINf4JZY4swBQSwMEFAAAAAgA LoWOKsTWLp0QAAAAUA
AAAAMAAABDQ0OtwIEAAAAAgCDY+CGWOLMAUEsDBBQAAAAIADKF jiqyEuVgEAAAAFAAAAADAAAARERErcC
BAAAAAIAg2fgdljizAFBLAQIUABQAAAAIACeFjip9jZkaEAA AAFAAAAADAAAAAAAAAAEAIAAAAAAAAABB
QUFQSwECFAAUAAAACAArhY4qOPhNMxAAAABQ AAAAAwAAAAAAAAABACAAAAAxAAAAQkJCUEsBAhQAFAAAA
AgALoWOKsTWLp0QAAAAUAAAA AMAAAAAAAAAAQAgAAAAYgAAAENDQ1BLAQIUABQAAAAIADKFjiqyEuVgEA
AAAFAAAAADAAAA AAAAAAEAIAAAAJMAAABERERQSwUGAAAAAAQABADEAAAAxAAAAAAA
希望有人能尽早的把解密算法注册出来.
看到这,你也许急着知道,究竟这些记录都存放在什么地方,别急,他们就存放在这个地方:
c:\program files\internet mail and news\%user%\mail\*.mbx
(用你的用户名来替换其中的%user%)
如果你走运的话,你会发现在以下的目录里也有他们的身影:
c:\windows\application data\microsoft\outlook\mail\*.mbx
我第一次安装OUTLOOK的时候,我只在"internet mail and news."目录里找到了以上的文件,而当我卸载OUTLOOK又重新安装他时,这些文件又被存放到了"application data"文件夹中.
想要删除这些暗中保留的信息,你只要输入以下的命令(当然如果你执行了这些删除操作你所有的E-MAIL信息也就消失了,所以请先备份重要的信息)
Deltree c:\windows\intern~1\%user%\mail
或者
Deltree c:\windows\applic~1\micros~1\outloo~1\mail
--------------------------------------------------------------------------------
6.微软是如何做到这些的
不知你可曾考虑微软是如何让这些文件在DOS和Windows Explorer中都不可见的?我曾经一度非常困惑,因为即使我使用DOS6.2的启动盘来启动计算机仍然看不到这些文件.这个问题困扰了我很久,但是最终我还是在这些文件夹中找到了原因.
"desktop.ini"是一个文件夹中的标准文本文件,用来定制一类文件夹行为的某些特定的方面.在这个方面,微软使用"desktop.ini" 文 件来使得这些文件不可见.使这些文件对于Windows Explorer,DOS,"查找功能"都不可见.(这就是你为什么不能在这些文件夹中执行"查找"功能的原因了)
这里有一些例子:
在c:\windows\temporary internet files\desktop.ini和c:\windows\temporary internet files\content.ie5\desktop.ini文件中都可以找到以下的一些代码:
[.ShellClassInfo]
UICLSID={7BD29E00-76C1-11CF-9DD0-00A0C9034933}
和
[.ShellClassInfo]
UICLSID={7BD29E00-76C1-11CF-9DD0-00A0C9034933}
CLSID={FF393560-C2A7-11CF-BFF4-444553540000}
其中的UICLSID键值使的这个文件夹在DOS和Explorer中都不可见,而CLSID则禁用了这个文件夹中的查找功能.除此之外,他们还让这些文件夹表现为"历史"状态.(如果你仔细研究了这些东西,你会明白我的意思的)
在删除了"desktop.ini"文件后,DOS和Windows Explorer又恢复了正确显示这个文件夹的功能.问题是,在你计算机的下一次重启时,windows会重新生成这个"desktop.ini"文件. 解决的办法是编辑"desktop.ini"文件,删除除了[.ShellClassInfo]以外的所有内容.这样可以欺骗过windows,让他以为 自己已经恢复了这个文件,而不会再次去生成"desktop.ini"文件.
顺便提醒一下,如果你想删除你的注册表中的这个键值,这些文件夹同样不会显示出来.但是,我仍然坚信总会有人能找出一个彻底的解决微软在你的计算机里"深度隐藏"文件的办法.
--------------------------------------------------------------------------------
7.+s代表隐秘而不是系统
现在有3个关于DOS的简单的是或否问题.就象你为了得到你的A+证明一样耐着性子做做看吧:
1)是或否:在根目录下执行dir/s会显示你的硬盘中的所有正常属性的文件和文件夹. 正确答案是:" 是! "
2)是或否:在根目录下执行dir/s/ah会显示你的硬盘中的所有隐藏属性的文件和文件夹. 正确答案同样是:" 是! "
3)是或否:在根目录下执行dir/s/as会显示你的硬盘中的所有系统属性的文件和文件夹. 正确答案同样是:" 那只是你这样认为的! "
当DOS想要获得任何包含一个系统属性的子目录的文件列表时,就会遇到一个无形的阻挡墙.这不仅意味着微软采取了特殊的防范以阻止人们找到这些系统文件,而且使得参数中的第一个"/s"也完全失效,"真狠啊!"
如果你还不明白,不妨来做以个小试验来看看我究竟是什么意思.
因为content.ie5和history.ie5文件夹都是包含系统属性,正确的查找命令应该如下:
CD\
DIR *.IE5 /s/as
屏幕会显示"No files found"的错误信息.
这就证明了所有包含系统属性的文件或文件夹都不讳被显示出来,但是请相信我,他们确实存在!
现在,最有趣的地方就是你可以绕过这个无形的阻挡墙.方法就是,一旦你进入了一个系统目录,那么这个阻挡墙在列目录的时候就会失效.譬如:
CD\WINDOWS\TEMPOR~1
DIR *.IE5 /as
1 folder(s) found.
现在,你就可以看到他们了(但是条件是你知道他们的确切的位置).换句话说,如果你不事先知道这些文件夹的存在,那么你就别想找到他们!
--------------------------------------------------------------------------------
8.FIND FAST的真正面目
你是否考虑过,为什么"FIND FAST"程序会出现在你的控制面板里?我曾经花费了一个小时在microsoft.com阅读帮助文件,但是我仍然不知道这个程序有什么用处.下面就是我在microsoft.com上找到的关于"FIND FAST"的信息片段.
"FIND FAST索引是用来加速在微软OFFICE程序包括微软OUTLOOK里执行"打开"或者"打开OFFICE文档"的速度的工具."
这究竟是什么意思?好,如果你再次仔细的阅读这个片段,你会看到,微软并没有提到任何会加快"查找"速度的词语.事实上是,他和"查找:文件或程序"功 能 没有任何关系.我想微软想表达的真正意思是说当你在微软WORD中选择"文件">"打开"时,你的文档列表会更快的显示出来.
如果他们所说的真是我以上表达的意思的话,微软又撒了一个谎言!我希望你不会认为我是在对微软断章取义.我只是试图让你明白微软所做的一切只是想让这个"FIND FAST"看上去是为了加快查找速度而存在的.
譬如,如果你在微软的WORD里选择"编辑"你会发现在其中有一个"FAST FIND"图标(望远镜图标).这是一个与"FIND FAST"明显有关系的暗示的程序.但是如果你再读一遍那段片段,你会发现其中只字未提在一个文档查找词语,而他的意思是查找文档本身.这里还有一些来自 微软的片段:
"FIND FAST索引会默认记录在硬盘中的所有的WORD文档,当其中的一个文档被移动后,FIND FAST索引会自动更新自己的索引."
"索引是用于在OFFICE程序中更快的找到文件."
"FIND FAST索引会在你安装微软OFFICE97时自动被安装到你的计算机里.FIND FAST索引会加快你在微软OFFICE程序中选择打开文件对话框时查找文件的速度"
看了以上的这些片段,你以为你知道了事情的真相了么?!
如果我告诉你FIND FAST实际上是在扫描和索引你的硬盘上的所有文件,你会不会惊讶呢?!你是否还记得在OFFICE95中,FIND FAST索引有个过滤列表其中包括".exe,.swp,.dll和其他一些扩展名"呢?难道这个功能被取消了?!如果你是一位程序员,那么在你为 FIND FAST做过滤列表时,你会选择所有的文件和是单单带有OFFICE扩展名的呢?!
这里还有一些很有趣的真相:
FIND FAST在每一次启动时都会自动运行(因为他被添加到了你的启动组中).如果你在磁盘扫描的过程中出错(由于"磁盘写"问题),那么就是因为FIND FAST在后台悄悄的为你的硬盘进行索引.这里还有一个很好的例子说明微软费尽苦心阻止人们发现FIND FAST正在悄悄的索引你的硬盘(微软总是很擅长找借口来掩饰).我引用如下:
"当你想通过生成索引对话框制定了需要索引的文档类型时,那么下表中列出了所有类型的文档."
Doc Type File Name Extension
Microsoft Office files All the Microsoft Excel, Microsoft Web documents PowerPoint,
Microsoft Project, and Microsoft Word document types listed in this table.
Microsoft Binder (.odb, .obt) and Microsoft Access (.mdb) files. Note that in .mdb files,
only document properties are indexed.
Microsoft Excel workbooks .xl* files
Microsoft PowerPoint files .ppt (presentation), .pot (template), .pps
(auto-running presentation) files
Microsoft Project files .mpp, .mpw, .mpt, .mpx, .mpd files
Microsoft Word documents .doc (document), .dot (template), .ht* (Hypertext
Markup Language document), .txt (text file), .rtf (Rich Text format) files
All files *.* files
你注意到最后的一部分了么?假设你是一个非常有钱的人,你准备买下商店里的每一辆车.那么你会说:
a)"我想买所有的红色,所有的蓝色,所有的银色,所有的白色,所有的香槟色,和所有的车."或者
b)"我想买下所有的车."
正如你看到的一样,微软不想让人们意识到FIND FAST正在索引你的整个硬盘,他们只是带着你说"我想买所有的红色,所有的蓝色,所有的银色..."
我个人发现这个"FIND FAST索引"在我将他从我的"启动组"里删除后又偷偷的溜进了我的"启动组".不可能是我故意这么做的,除非我先建立一个FIND FAST的快捷方式,然后在把这个快捷方式手工的移到我的"启动组"里,因为在在FIND FAST程序里并没有任何可以将其加入"启动组"的选项.
那么我如何来弥补这个后门呢?!难道我没有这样想过?但是就算我做了了,这也无法改变他所带来的不可弥补的矛盾.譬如:
1)进入DOS模式
2)CD\
3)DIR FF*.* /AH(这将显示所有和FIND FAST有关的文件)
4)edit /75 %ff%(将上面显示的所有文件名替换%ff%)
注意到了这些难以置信的数量文件指向"深度隐藏"的文件夹"Temporary Internet Files"了么?那么究竟FIND FAST要对这些"深度隐藏"的文件夹做些什么呢?!
--------------------------------------------------------------------------------
8.1删除FIND FAST
1)重启你的计算机进入MS-DOS模式
2)从c:\windows\system删除FindFast.CPL文件
3)删除c:\windows\start menu\programs\startup里的快捷方式
4)从c:\progra~1\micros~1\office删除FindFast.EXE文件
还有一些相关的文件也可以安全删除:
5)FFNT.exe, FFSetup.dll, FFService.dll, FFast_bb.dll, 以及c:>ff*.*文件
你会发现在你删除这些文件后你并没有丧失任何功能,实际上你重新是获得了你该有的功能.
--------------------------------------------------------------------------------
9.看看微软为了防止人们发现这些隐藏的文件而尽了多大的努力
如果上面所说的"desktop.ini"文件还不能充分的说明的话(天啊,我是不知道desktop.ini文件还可以让文件夹不可见!),如果你认 为对于系统文件夹来说DOS中的"/s"实效仅仅是"bug"而已,如果你认为微软在这些"深度隐藏"的文件夹中屏蔽"查找"功能只是为了节省你的时间的 话(哈哈哈),那么你就去Hackers.com的BBS上去再搜索一下这个关键字吧,不会让你失望的!!
--------------------------------------------------------------------------------
10.最终注解和联系方式
这个指导会一直更新,如果你有什么建议的话,可以发E-MAIL给我,我会在以后的版本中把你的建议融合进去.你可能会发现在这篇指导中,很多地方要求你能联系我.这是因为我想知道事情的点点滴滴.正因为如此,我抛弃了以前的版本,请确认你所阅读的是最新版本.
我的E-MAIL地址将会在下面给出.也许你的来信不能及时的回复,但是我保证回复所有发给我的E-MAIL.顺便说一下,出于安全考虑,我删除了我的PGP.如果你想私下里联系我,我相信我们会做出点成效的.
感谢阅读本文-----The Riddler
E-MAIL:mailtther1ddler@f u c k m i c r o s o f t.c o m
网址:http://www.hackers.com/bulletin/ ;
--------------------------------------------------------------------------------
10.1推荐阅读
如果你还没有尽兴,我象你强烈推荐下面的这些站点或文章:
http://www.theregister.co.uk/content/4/18002.html ;
http://www.findarticles.com/m0CGN/3741/55695355/p1/article.jhtml ;
http://www.mobtown.org/news/archive/msg00492.html ;
http://194.159.40.109/05069801.htm ;
http://www.yarbles.demon.co.uk/mssniff.html ;
http://www.macintouch.com/o98security.html ;
http://www.theregister.co.uk/content/archive/3079.html ;
http://www.fsm.nl/ward/ ;
http://slashdot.org/ ;
http://www.peacefire.org/ ;
http://stopcarnivore.org/ ;
http://nomorefakenews.com/ ;
http://grc.com/steve.htm#project-x
--------------------------------------------------------------------------------
11.特别鸣谢
感谢Skywalker,给我提供及时到位的帮助,你是目前唯一有兴趣帮我深入我的研究的人.
感谢所有特地发E-MAIL给我鼓励我的人,你们的这些话语对我来说意义重大,给了我完成这篇文章的巨大动力.
感谢Hackers.com,感谢为我们提供了这样一个充满了交流气氛的站点,没有Hackers.com,也就不会有我这篇指导的存在
--------------------------------------------------------------------------------
12.参考联接
http://support.microsoft.com/support/kb/articles/Q137/1/13.asp ;
http://support.microsoft.com/support/kb/articles/Q136/3/86.asp ;
http://support.microsoft.com/support/kb/articles/Q169/5/31.ASP ;
http://support.microsoft.com/support/kb/articles/Q141/0/12.asp ;
http://support.microsoft.com/support/kb/articles/Q205/2/89.ASP ;
http://support.microsoft.com/support/kb/articles/Q166/3/02.ASP ;
http://www.insecure.org/sploits/ ;
http://www.parascope.com/cgi-bin ;
http://www.hackers.com/bulletin/ ;
http://slashdot.org/articles/00/05/11/173257.shtml ;
http://peacefire.org/ ; -
2005-03-18
linux 系统下c语言编程入门 - [computer]
-
2005-03-18
linux 系统下c语言编程入门 - [computer]
-
2005-03-18
linux 系统下c语言编程入门 - [computer]
-
2005-03-18
linux 系统下c语言编程入门 - [computer]
-
void abort ( void );
打印“Abnormal termination program”,立即停止进程。不关闭任何已打开的流
也不执行atexit确定的任何函数。
The calling process does not receives back control. abort returns error
code 3 to the parent process or the OS/* abort example */
#include <stdio.h>
#include <stdlib.h>int main ()
{
FILE * pFile;
pFile= fopen ("myfile.txt","r");
if (pFile == NULL)
{
printf ("error opening file\n");
abort();
}/* normal file manipulation here */
fclose (pFile);
return 0;
}
If myfile.txt doesn't exist a message is printed, abort is called and
the errorlevel.returned would be 3. Otherwise the file is normally
closed and the errorlevel returned is 0 (return 0).///////////////////////////////////////////////////////////////////////
void exit ( int status );
函数执行标准的清理过程,之后结束。在清理之前,被atexit注册的函数首先
被执行。
清理过程要关闭所有的缓存和关闭任何打开的文件。
参数status 返回给父进程(如果存在),或者给操作系统(就象在main函数有
一个return语句)
总之,返回0或EXIT_SUCCESS表示成功,其它任何值或常量EXIT_FAILURE表示一
个错误
或不正常的程序终止。
/* exit example */
#include <stdio.h>
#include <stdlib.h>int main ()
{
FILE * pFile;
pFile = open ("myfile.txt","r");
if (pFile==NULL)
{
printf ("Error opening file");
exit (1);
}
else
{
/* file operations here */
}
return 0;
}/////////////////////////////////////////////////////////////////////
int atexit ( void (* function ) (void) );指定函数在离开时执行。
function变量指定的函数在程序正常结束时被调用。
如果有一个以上的指定函数,它们将按相反顺序执行。
ANSI标准指定最多32个函数可以在一个进程内被指定。
这些函数在被调用时不会接受任何变量。
如果成功返回0,如果存在一个错误返回一个非零值。
/* atexit example */
#include <stdio.h>
#include <stdlib.h>void fnExit1 (void)
{
printf ("Exit function 1.\n");
}void fnExit2 (void)
{
printf ("Exit function 2.\n");
}int main ()
{
atexit (fnExit1);
atexit (fnExit2);
printf ("Main function.\n");
return 0;
}///////////////////////////////////////////////////////////
int abs ( int n );
返回整数变量的绝对值
ANSI-C++中还结合了 long abs (long n );
其功能和函数labs相同////////////////////////////////////////////////////////////////
double atof ( const char * string );
解析string的内容,并转换成浮点数。string 内容是一个浮点数的字符串表示。
数字直到一个非数字字符被发现为止(数字,符号,E和e在指定的格式内认为是
有效的)。
格式为:[whitespaces][+|-][nnnn][.mmmm][e|E[+|-]nnnn]其中whitespaces
是tab或space字符
nnnnn是数字字符的任何一个。
返回的是输入字符串转换成的浮点值。一旦溢出结果将不确定。如果有一个错误
将返回0.0
* atof example: sines calculator */
#include <stdio.h>
#include <stdlib.h>
#include <math.h>int main ()
{
double n,m;
double pi=3.1415926535;
char szInput [256];
printf ( "Enter degrees: " );
gets ( szInput );
n = atof ( szInput );
m = sin (n*pi/180);
printf ( "sine of %f degrees is %f\n" , n, m );
return 0;
}Output:
Enter degrees: 45
sine of 45.000000 degrees is 0.707101
///////////////////////////////////////////////////////////////
int atoi ( const char * string );
把字符串转换为整数值,直到遇到非字符值时才结束()。
格式为[whitespaces][+|-][nnnn][.mmm][e|E[+|-]nnn]
如果溢出,结果将不确定。如果错误出现将返回0
/* atoi example */
#include <stdio.h>
#include <stdlib.h>int main ()
{
int i;
char szInput [256];
printf ("Enter a number: ");
gets ( szInput );
i = atoi (szInput);
printf ("Value entered is %d, and its double %d",i,i*2);
return 0;
}Output:
Enter a number: 73
Value entered is 73, and its double 146
//////////////////////////////////////////////////////////
long atol ( const char * string );/* atol example */
#include <stdio.h>
#include <stdlib.h>int main ()
{
int i;
char szInput [256];
printf ("Enter a long number: ");
gets ( szInput );
i = atol (szInput);
printf ("Value entered is %d, and its double %d",i,i*2);
return 0;
}Output:
Enter a long number: 567283
Value entered is 567283, and its double 1134566///////////////////////////////////////////////////////
char * ecvt ( double value,int num, int *dec, int * sign );
把数值转换为以'\0'结束的字符串。如果num大于可表示的value字符数,那么余
下的字符串就填补为o
如果num小于,那么多余的就舍去。
仅当位数被返回时。十进数的可以从dec获得。The position of the decimal
point can be otained from dec, that is a pointer to an int value
representing the position of the decimal point respect to the beginning
of the string (0 or less indicates that the decimal point lies to
the left of the digits). 数值符号可以从sign变量获得。它指向一个int值
(如果是0,值就是正,否则就是负)。
行为象fctv
value 为将被转换为字符串的浮点数
num 返回数字的位数,如果大于可表示的位数,余下的部分将填补为0,如果小,
低位的位数将被省略。dec 一个指向int的指针。存储小数点位置。如果是零或
更小,小数点在位数的左边。
sign 一个指向int的指针。0代表正号,非零代表负数。
返回一个'\0'结束的字符串,其长度为num(代表数值的位数),小数点和符号
不被返回。而在dec和sign变量中。
这个缓冲器是静态分配。如果ecvt或fcvt调用,它将被重写。
/* ecvt example: scientific notations */
#include <stdio.h>
#include <stdlib.h>int main ()
{
char *buffer;
double value = 365.249;
int precision = 5;
int decimal, sign;
buffer = ecvt (value, precision, &decimal, &sign);
printf ("%c%c.%s x 10^%d\n",sign?'-':'+',buffer[0],buffer+1,decimal-1);
return 0;
}Output:
+3.6525 x 10^2
/////////////////////////////////////////////////////////////////////////////////////
double atof ( const char * string )
把字符串转换成double
string代表一个浮点数。直到非数字符为止才认为输入结束(位数,符号数,
e和E都认为在此特定格式下
是有效数字)。[whitespaces][+|-][nnnn][.nnnn][e|E[+|-]nnn]
返回的是转换的浮点值。如果溢出,结果不确定。如果出现错误,返回0.0
/* atof example: sines calculator */
#include <stdio.h>
#include <stdlib.h>
#include <math.h>int main ()
{
char inputs[300];
double n,m;
const double pi = 3.1415926;
printf("enter degrees : ");
gets ( inputs );
n = atof ( inputs );
m = sin (n*pi/180);
printf (" since of %f degrees is %f ",n , m);
return 0;}
/////////////////////////////////////////////////////////////////////////////////////////
char * gcvt ( double value,int num,char * buffer );
转换浮点数为一个'\0'结束位数为num的字符串。gcvt产生一个包括小数点的十
进制数,如果需要还会有符号。num表示的位数不足,函数将产生一个指数形式
的数,就像printf 的%e做的。函数还会在字符串后附一个'\0'
所以存放string的buffer通常比num更大。
value 将被转换为字符串的浮点数
num 产生的位数
buffer 存储转换结果的字符串。它应该比num大,以便可以存储小数点、符号
和可能的指数信息还有一个'\0'
总之,如果执行,buffer应该比num大8和9个字符。
返回的是以'\0'结束的数字字符串。
/* gcvt example */
#include <stdio.h>
#include <stdlib.h>int main ()
{
char buffer [20];
gcvt (1365.249,6,buffer);
puts (buffer);
gcvt (1365.249,3,buffer);
puts (buffer);
return 0;
}Output:
1365.25
1.37e+003
/////////////////////////////////////////////////////////////////////////////////////////////
int atoi ( const char * string );
把字符串存储的数字字符转换为整型,并返回一个int值。
string代表一个数字字符表示的字符串。数字直到'\0'为止(数字符、和符号在
特定的格式下认为是有效的)。这个格式
为[whitespaces][+|-][nnnn]
返回转换的整数值,一旦溢出,结果将不确定。如果有错误返回0
/* atoi example */
#include <stdio.h>
#include <stdlib.h>int main ()
{
int i;
char szInput [256];
printf ("Enter a number: ");
gets ( szInput );
i = atoi (szInput);
printf ("Value entered is %d, and its double %d",i,i*2);
return 0;
}Output:
Enter a number: 73
Value entered is 73, and its double 146
////////////////////////////////////////////////////////////////////////////////////////////////
long atol ( const char * string );与 int atoi ( const char * string );
类似
///////////////////////////////////////////////////////////////////////////////////////////////
double strtod ( const char * string, char * * endptr);
endptr 一个指针。函数向它填充扫描结束时的地址。以便决定第一个非数字字符
的位置。
如果转换导致溢出结果将是+/- HUGE_VAL
如果有错误出现返回0
/* strtod example */
#include <stdio.h>
#include <stdlib.h>int main ()
{
char szInput [256];
char * pEnd;
double dbl;
printf ("Enter a floating-point value: ");
gets (szInput);
dbl = strtod (szInput,&pEnd);
printf ("Value entered: %lf. Its square: %lf\n",dbl,dbl*dbl);
return 0;
}/////////////////////////////////////////////////////////////////////////////////////////////
long strtol ( const char * string, char * * endptr, int radix);
有效数字为0到radix-1格式为[whitespaces][+|-][0|0x][nnnnn]
radix(基数) 0x代表16进制数。0代表8进制数。1到9的任何数代表10进制
如果溢出结果是LONG_MAX OR LONG_MIN
如果出现错误或没有转换将返回0
/* strtol example */
#include <stdio.h>
#include <stdlib.h>int main ()
{
char szInput [256];
char * pEnd;
long l;
printf ("Enter an integer value: ");
gets (szInput);
l = strtol (szInput,&pEnd,0);
printf ("Value entered: %ld. Its double: %ld\n",l,l*2);
return 0;
}
//////////////////////////////////////////////////////////////////////////////////////
unsigned long strtoul ( const char * string,char * * endptr, int rsdix);
如果溢出结果为ULONG_MAX,如果出现错误返回0
* strtoul example */
#include <stdio.h>
#include <stdlib.h>int main ()
{
char szInput [256];
char * pEnd;
unsigned long ul;
printf ("Enter an integer value: ");
gets (szInput);
ul = strtoul (szInput,&pEnd,0);
printf ("Value entered: %lu. Its double: %lu\n",ul,ul*2);
return 0;
}
/////////////////////////////////////////////////////////////////////////////////////////
char * itoa ( int value, char * buffer, int radix);
把整型转换为'\0'结束的radix进制的数字字符串。并且不结果存储在给定的
buffer。如果radix是10而且值是负字符串前首先为-。对于任何其它的radix,
value总是被认为是无符号的。buffer应该足够大。以便可以容下可能的值
(sizeof(int)*8+1)(对于radix=2)。例如在16位的平台用在17个字节
32位的平台用33字节。
radix在2到36之间。
/* itoa example */
#include <stdio.h>
#include <stdlib.h>int main ()
{
int i;
char buffer [33];
printf ("Enter a number: ");
scanf ("%d",&i);
itoa (i,buffer,10);
printf ("decimal: %s\n",buffer);
itoa (i,buffer,16);
printf ("hexadecimal: %s\n",buffer);
itoa (i,buffer,2);
printf ("binary: %s\n",buffer);
return 0;
}Output:
Enter a number: 1750
decimal: 1750
hexadecimal: 6d6
binary: 11011010110
//////////////////////////////////////////////////////////////////////////////////////////////
char * ultoa ( unsigned long value, char * buffer, int radix);
char * ltoa ( long value,char * buffer,int radix);
///////////////////////////////////////////////////////////////////////////////////////////////////////
char * getenv ( const char * varname );
得到一个以'\0'结束的字符串,该字符串表示的是名字位varname的环境变量。
如果要求的变量没有在环境中定义,函数返回指针NULL
返回的指针不是旨在修改环境变量的操作。参考平台的手册。
varename null结束的字符串,其包含所要求变量的名字。
返回所要求环境变量的值,其以null结束的字符串表示。如果环境变量不存在返
回NULL
不要使用返回的指针直接修改程序的环境变量。
/* getenv example: getting path */
#include <stdio.h>
#include <stdlib.h>int main ()
{
char * buffer;
buffer = getenv ("PATH");
if (buffer!=NULL)
printf ("Current path is: %s",buffer);
return 0;
}
///////////////////////////////////////////////////////////////////////////////////////////
int putenv ( const char * envvar);
增加指定的字符串变量到现在进程的环境中去。因为环境每个名字只接受一个
变量。这一函数也可以用于修改和删除现存的环境变量。putenv只能修改此进
程的和由此创造的进程的环境变量,而不是操作系统的等级上。
一旦此进程结束,父进程的环境变量将不会在这次调用十被改变。
envvar 是null结束的字符串,其包含变量的名字、等号=和环境变量的值。
varemane=value
如果环境变量的值存在它的值将被代替。如果值没有指定,那么拥有此环境变
量的值将被去除。
如果成功返回0。如果发生错误返回-1
/* putenv example */
#include <stdio.h>
#include <stdlib.h>int main ()
{
char * buffer ;
buffer = getenv ("RESOURCES");
if (buffer==NULL)
{
putenv ("RESOURCES=www.cplusplus.com");
puts ("environment variable successfully set");
}
else puts ("environment variable already existed");
return 0;
}///////////////////////////////////////////////////////////////////////////////////////////
int system ( const char * command);
调用命令解释器执行一个命令。一旦结束,解释器把控制交还给程序,并且返还
一个int值。command 是一个用'\0'结束的字符串表示的系统命令。
如果命令成功执行将返回适当的值。一般0表示无错误的执行结束。返回-1表示
一个错误
全局变量errno被设置以便指定以下错误中的一个。
ENOENT Command interpreter not found
ENOEXEC Command interpreter is not executable
ENOMEM Error allocating memory for the process
E2BIG Argument list too big
/* system example : DIR */
#include <stdio.h>
#include <stdlib.h>int main ()
{
int i;
puts ("Trying to execute command DIR");
i = system ("dir");
if (i==-1) puts ("Error executing DIR");
else puts ("Command successfully executed");
return 0;
}
//////////////////////////////////////////////////////////////////////////////////////
div_t ( int numer, int denom );
numer被denom除,得到的商和余数返回给结构体div_t中。
numer是分子,denom是分母。
返回一个结构体div_t ,typedef struct { int quot; int rem; } div_t;
div_t在stdlib.h中定义,quot代表商,rem代表余数。
/* div example */
#include <stdio.h>
#include <stdlib.h>int main ()
{
div_t divresult;
divresult = div (38,5);
printf ("38 / 5 = %d ( %d", divresult.quot, divresult.rem);
return 0;
}Output:
38 / 5 = 7 ( 3
////////////////////////////////////////////////////////////////////////////
ldiv_t ldiv ( long int numer, long int denom );
typedef struct { long int quot, long int rem } ldiv_t;
////////////////////////////////////////////////////////////////////////////
long labs (long n ); 与abs一样
////////////////////////////////////////////////////////////////////////////
void * calloc ( size_t num, size_t size);
动态分配num个size字节大小的元素的存储空间。其块空间全部初始化位0
最终结果是分配num*size字节的存储空间。
返回分配空间的指针。此指针的类型为void * 通常要对返回的指针进行相应的
类型转换。如果系统不能分配相应大小的
存储空间或者有变量为0 将返回指针NULL
/* calloc example: rememb-o-matic */
#include <stdio.h>
#include <stdlib.h>int main ()
{
int i,n;
int * pData;
printf ("Enter number of items to be remembered: ");
scanf ("%d",&i);
pData = (int*) calloc (i,sizeof(int));
if (pData==NULL) exit (1);
for (n=0;n<i;n++)
{
printf ("Enter number #%d: ",n);
scanf ("%d",&pData[n]);
}
printf ("You have entered: ");
for (n=0;n<i;n++) printf ("%d ",pData[n]);
free (pData);
return 0;
}
///////////////////////////////////////////////////////////////////////////////////////////////
void * malloc (size_t size);
分配size字节的存储空间。如果成功,返回指向存储空间的指针。如果不能分配
足够的空间或者size为0将返回
NULL
/////////////////////////////////////////////////////////////////////////////////////////////////
void * realloc ( void * memblock,size_t size);
menblock指针变量指向的存储空间大小变为size字节(可扩张也可减少)。
此块能会移动到新的地方,此时存储空间的内容仍然不会变。
如果memblock是NULL函数行为象malloc一样分配一个新的size字节的存储空间。
并返回其指针。
如果size是0先前分配的memblock被解析,并返回NULL
/* realloc example: rememb-o-matic */
#include <stdio.h>
#include <stdlib.h>int main ()
{
int input,n;
int count=0;
int * numbers = NULL;do {
printf ("Enter an integer value (0 to end): ");
scanf ("%d", &input);
count++;
numbers = (int*) realloc (numbers, count * sizeof(int));
if (numbers==NULL)
{ puts ("Error (re)allocating memory"); exit (1); }
numbers[count-1]=input;
} while (input!=0);printf ("Numbers entered: ");
for (n=0;n<count;n++) printf ("%d ",numbers[n]);
free (numbers);return 0;
}
///////////////////////////////////////////////////////////////////////////////
void free (void * memblock );
释放先前malloc、calloc、realloc分配的空间。
memblock必须为先前分配的空间的指针。如果无效的指针给函数,其结果将不确
定。
/* free example */
#include <stdio.h>
#include <stdlib.h>int main ()
{
int * buffer1, * buffer2, * buffer3;
buffer1 = (int*) malloc (100*sizeof(int));
buffer2 = (int*) calloc (100,sizeof(int));
buffer3 = (int*) realloc (buffer2,500*sizeof(int));
free (buffer1);
free (buffer3);
return 0;
}
////////////////////////////////////////////////////////////////////////
void * lfind ( const void * key,const void * base,size_t num,size_t
width,int (* fncomparison)(const void *,const void *));
线性搜索
在指针base和num个元素形成的数组中搜索给定的key,每个元素大小为width字节。
返回第一个匹配key的第一个元素地址。函数fncomparison
执行比较操作。
函数执行线性搜索,所以不必在调用之前进行排序。
key 寻找对象的指针
base 被查找的数组的指针
num 数组的元素个数
width 数组中每个元素的大小
fncompare 比较两个元素的函数。 这个函数必须由其调用者提供,而且还要如
下面一样申明。
int fncompare ( const void * elem1,const void * elem2);
函数需要接受两个变量,而且它们都是元素的指针。当两个变量相等就返回0,
如果不等就返回非0值
返回数列中与key匹配的值的指针。如果没有找到key 返回NULL
/* lfind example */
#include <stdio.h>
#include <stdlib.h>int values[] = { 10, 40, 100, 20, 90, 25};
int compare (const void * a, const void * b)
{
return ( *(int*)a - *(int*)b );
}int main ()
{
int * pItem;
int key = 40;
pItem = (int*) lfind (&key, values, 6, sizeof (int), compare);
if (pItem!=NULL)
printf ("%d is in the array",*pItem);
else
printf ("%d is not in the array",key);
return 0;
}//////////////////////////////////////////////////////////////////////////////////////////
void* lsearch ( const void * key, void * base, size_t num, size_t
width, int (*fncomparison)(const void *, const void * ) );
与lfind基本相同
/////////////////////////////////////////////////////////////////////////////////////////////////
void * bsearch ( const void * key,const void * base,size_t num,size_t
width,int (*dncompare)(const void *,const void *));
因为函数执行的是binary serach,所以数组应该事先按从小到大的排序。
int fncompare (const void * elem1,const void elem2);
当 *elem1 < *elem2时返回值<0 ;当 *elem1 == *elem2时返回值0 ;
当 *elem1 > *elem2时返回值>0
/* bsearch example */
#include <stdio.h>
#include <stdlib.h>int values[] = { 10, 20, 25, 40, 90, 100 };
int compare (const void * a, const void * b)
{
return ( *(int*)a - *(int*)b );
}int main ()
{
int * pItem;
int key = 40;
pItem = (int*) bsearch (&key, values, 6, sizeof (int), compare);
if (pItem!=NULL)
printf ("%d is in the array",*pItem);
else
printf ("%d is not in the array",key);
return 0;
}
//////////////////////////////////////////////////////////////////////////////////////////////
void qsort (void * base,size_t num,size_t width,
int (*fncompare)(const void *,const void *));
使用快速排序法进行排序。
int fncompare ( const void * elem1,const void * elem2);
如果*elem1 goes before *elem2则<0;如果*elem1 goes before *elem2则<0;
如果*elem1 == *elem2则 0;
如果*elem1 goes after *elem2则>0;
/* qsort example */
#include <stdio.h>
#include <stdlib.h>int values[] = { 40, 10, 100, 90, 20, 25 };
int compare (const void * a, const void * b)
{
return ( *(int*)a - *(int*)b );
}int main ()
{
int * pItem;
int n;
qsort (values, 6, sizeof(int), compare);
for (n=0; n<6; n++)
{
printf ("%d ",values[n]);
}
return 0;
}Output:
10 20 25 40 90 100
/////////////////////////////////////////////////////////////////////////////////////////
void swab (char * scr,char * dest,int num);
交换字节 交换scr指向的num个字节,并且将结果存储在dest。
交换scr中的每两个字节的数据,如果num是奇数,最后一个数据不会传到dest中。
/* swab example */
#include <stdio.h>
#include <stdlib.h>/* global arrays: destination[] initialized with zeros */
char source [7] = "ABCDEF";
char destination [7];int main ()
{
swab (source, destination, 6);
printf ("swab: %s -> %s\n", source, destination);
return 0;
}
////////////////////////////////////////////////////////////////////////////////////////
max(a,b); 是宏定义 #define max(a,b) ((a)>(b)?(a):(b))
min(a,b); 是宏定义 #define min(a,b) ((a)<(b)?(a):(b))
////////////////////////////////////////////////////////////////////////////////////////
int rand (void);
返回一个伪随机数,此数在0到RAND_MAX范围内。它每次返回一个不相关的数。
此算法需要函数srand
产生更实际的随机数。RAND_MAX是在stlib.h中定义的常量。Its default value
is implementation defined
一个产生几乎全真的随机数的方法就是使用以秒表示的时间为参数的srand进行初
始化。如果产生一个范围的随机数,最好是用取余(%)操作。例如:rand()%25产
生0到24的值。
/* rand example */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>int main ()
{
/* initialize random generator */
srand ( time(NULL) );/* generate some random numbers */
printf ("A number between 0 and RAND_MAX (%d): %d\n", RAND_MAX,
rand());
printf ("A number between 0 and 99: %d\n", rand()%100);
printf ("A number between 20 and 29: %d\n", rand()%10+20);return 0;
}
////////////////////////////////////////////////////////////////////////////////////////
void srand (unsigned int seed);
初始化随机数 使用seed以便设置一个rand产生随机数的起点。
如果seed被设置为1,函数将被重新初始化为调用rand或srand之前的初始值。
为了产生真正的随机数,建议使用一个变化平凡的seed值。例如,函数time返回
的值
/* rand/srand example */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>int main ()
{
/* initialize random generator */
srand ( time(NULL) );/* generate some random numbers */
printf ("A number between 0 and 100: %d\n", rand()%100);
printf ("A number between 20 and 30: %d\n", rand()%10+20);return 0;
}Output:
A number between 0 and 100: 93
A number between 20 and 30: 21////////////////////////////////////////////////////////////////////////////////////////
NULL
NULL is a defined constant used to express null pointers, that is,
an unassigned pointer or a pointer that points nowhere. It is defined
as:
#define NULL 0
size_t
Defined type used as arguments for some functions that require sizes
or
counts specifications. This represents an unsigned value generally
defined
in header files as unsigned int:
typedef unsigned int size_t;
//////////////////////////////////////////////////////////////////////////////////
//////////stdio.h/stdio.h/stdio.h/stdio.h///stdio.h/stdio.h/stdio.h/stdio.h///////////////////////////////////////////////////////////////////////////////
//////////stdio.h/stdio.h/stdio.h/stdio.h///stdio.h/stdio.h/stdio.h/stdio.h/////////
//////////////////////////////////////////////////////////////////////////////////////
-
2005-01-27
四本关于C/C++的巨著 - [computer]
这几本让读者和我在期待的C/C++巨著就是这期我要推荐的——《Essential C++中文版》、《Effective C++中文版》、《The C++ Programming Language》和《C++ Primer》。
Essential C++(Addison Wesley Pub Co.,1999年10月第一版)的作者Stanley B.Lippman更是C++领域一流的大师级人物,他从1984年开始就与C++结下了不解之缘:参与了第一个C++编译器C Front的开发,曾经和C++之父Bjarne Stroustrup(详见下)一起在贝尔实验室的项目组工作、负责研究C++程序开发环境中的对象模型,后来又担任著名的C++Report杂志编辑,此后他到迪斯尼旗下的梦工厂出任软件技术总监(Software Technology Director),主要著述有Essential C++、C++Primer、C++Gems、Inside the C++ Object Model、C#Primer等,关于作者的更详细信息可以到其个人网站(http://www.objectwrite.com,该网址笔者已验证无误)查询。Lippman当前在业界的影响力可以从最近发生的一件事情看出:不久前微软已经邀请了C++编程语言的先驱Stanley B.Lippman加盟它的Visual C++.Net开发小组,以打消广大的C++编程人员的疑虑。Essential C++是Lippman在C++ Primer之后的著作,可以说是厚积薄发的精髓之作。不要想当然地觉得这本书只有276页就是烹小鲜的入门向导——其实,我到觉得如果想通过一本书入门,1237页的C++ Primer或1109页的The C++ Programming Language更加适合。Essential C++分为7个章节,分别是C++基础、面向过程的编程风格、泛型编程风格、基于对象的编程风格、面向对象的编程风格、运用模板编程和异常处理。从结构的安排上我们可以看出作者的深意所在:并不是要手把手地教你键入和编译调试一个类似“Hello World”的程序,而是要一步一步地教会读者通过函数、指针、模板、类等构件形成一套完整的编程思想,在不同的需求情况下能够自如地使用面向过程或面向对象的方法进行程序设计,正如Bjarne Stroustrup在The C++ Programming Language一书中引用Kristen Nygaard(Simula语言的两位创造者之一)所说的“Programming is understanding”。如果你是一个新手,在阅读本书的时候不要忘了找一本更详细一些的参考教材——作者只用了30页的篇幅讲C++变成的基础知识,这里面还包括了数组、向量和指针等内容,《Essential C++中文版》(华中科技大学出版社,2001年8月第一版)已经出版,是侯捷的译著——恐怕业内很少有人不知道这位台湾大名鼎鼎电脑教育作家,建立在深刻理解基础上的翻译质量几乎可以说是无可挑剔了,但对于一些词汇的翻译方法和大陆翻译习惯的差异还有待磨合和改进(虽然译者坚持保留其繁体版译法)。
Effective C++(Addison Wesley Pub Co.,1997年9月第二版)没有教你C++语法或函数、对象、模板之类的东西,这是一本风格独到的经典技巧集,曾经获得过1992年度Jolt Award and Productivity Awards,作者教给你的是50个“改善程序技术与设计思维”的特别途径。Scott Meyers是C++业界公认的权威,主要从事软件开发咨询工作,活跃在全球各技术研讨会上,同时是C++ Report的重要专栏作家,知名著述出了Effective C++之外还有More Effective C++和Effective STL等,关于作者的更详细信息可以到其个人网站(http://www.aristeia.com)查询。《Effective C++中文版》(华中科技大学出版社,2001年9月第一版)也已经在国内翻译出版,译者还是侯捷。当你初步了解C++的全貌之后,Effective C++能够在短时间内大幅度地提高你C++编程的水平,此书的独特之处在于每一个你遇到的C++问题,Meyers都好像未卜先知地放在了书里,所有让你困惑的问题你几乎都可以在这本书中找到精辟的论述——如果能加Meyers的另一本巨著More Effective C++(Addison Wesley Pub Co.,1995年12月第一版)将更会锦上添花。本书在结构上分为改变旧有的C习惯、内存管理、构造析构函数与作业运算符、类与函数的设计和声明、类与函数的实现、继承关系与面向对象设计以及杂项讨论7个部分。很多人都认为你越熟悉C语言或其他面向过程的语言,在学习面向对象的语言的时候就会面临更大的困难,的确,如果你已经习惯了面向过程,在面向对象的时候你还是无法忘记过程,为此,Meyers在第一部分就提出了改变旧有的C习惯,通过几个小技巧让你能够尽量不受原有知识对新知识学习的干扰。在接下来的3个部分中,作者又针对让人头疼的内存管理问题(Java就宣称采用自动内存管理减少了编程复杂程度和出错几率是比C++的一大进步),随后,作者针对函数与类的构造析构、设计、实现等问题进行了详实的讨论,没有枯燥的长篇大论,都是结合实例的分析讲解——如果你刚学C++不久但已经可以独立编写一些简单的程序,你会发现所有被批判的问题程序中都可以找到自己的影子,这真是一件奇妙的事情!在“继承关系与面向对象设计”部分里作者没有喋喋不休地去讨论尚有争议的问题,而是把精力放在最基础的理念上,澄清了C++中类的继承体系设计与实现,并结合继承问题阐释了OOP。“杂项讨论”中作者主要讨论了编译、标准库等问题。打一个粗俗些的比方:Effec tiv e C++和M o re Effec tiv e C++就像是C++学习者的手挠,每一下都抓在你的痒处。
The C++ Programming Language(Addison Wesley Pub Co.,2000年2月第三版,高等教育出版社,2001年8月影印版)是无论哪一个C++学习者绝对、绝对不能错过的头号经典。Rogue Wave公司(Boland C++ Builder中STL方案的提供商)的Nathan Myers说:“15年之后,此书仍然是唯一一本无可替代的C++书籍。”只要有人推荐C++书籍,此书必在其中。正如侯捷先生1999年C++Primer繁体版前言中评价所说:“C++/OOP的领域极广……,不同的切入角度,都存在不同的经典好书。但如果考量的是语言全貌性(百科型)书籍,从来我只推荐两本,一是Bjarne Stroustrup的The C++ Programming Language,另一是Stanley B.Lippman的C++ Primer。这么说难免遗珠之憾,但是泰山北斗已现,又何必案牍劳形于墨瀚书海之中!这两本书都从C++盘古开天以来,一路改版,斩将搴旗,追奔逐北,成就一身荣光”。作者Bjarne Stroustrup是贝尔实验室大规模程序设计研究部门(Large-Scale Programming Research Department)负责人,AT&T、ACM成员,主要著述有The C++ Programm ing Language、The Design and Evolution of C++、The Annota ted C++ Reference Manual、C++ In-Depth Box Set(与别人合著)等。1979年Stroustrup开始开发一种语言,当时称为“C with Class”,后来演化为C++,并于1995年在贝尔实验室研制成功并投入使用的,Stro u strup也被称为“C++之父”,关于作者的更详细信息可以到其个人网站(http://www.research.att.com/~bs/homepage.html)查询。1998年,ANSI/ISOC++标准建立,同年,Strousturp推出了其经典著作The C++Programming Language的第三版。The C++Programming Language可是说非常全面、权威,充满了技术性极强的材料,很多地方值得反复回味与思索。Stroustrup说,他所接触和开发的软件无论是在大小、复杂性和难度来说,根本不是外界一般软件所能比拟的。本书虽然是一本计算机编程语言教程,但是处处体现出他对于软件开发和程序设计的看法。所以他在书中的很多观点虽然看上去不觉得有什么了不起的地方,但是当你面临到真正挑战的时候,就会深刻体会到其真知灼见非同一般。即便我们不考虑语言的障碍,这本书仍然比较难懂,作者很多地方点到即止,其中深意不是初学者能够真正领会的。这本书有个绰号——C++专家自学指南,也就是你必须先是专家,然后再来读此书自学提高。
C++ Primer是Lippman的成名大作——不要看到这个名字就真认为这是“C++的初级读本”,实际上它是一本标准的“从入门到精通”教材,目前该书的简体中文版还没有上市,我到处寻找其英文版也没能如愿,一个偶然的机会在朋友那里看到了侯捷(见上关于此书的评价)繁体中文版的C++Primer,大体翻看了一下,感觉此书在实例方面非常详尽,内容可谓是全面、权威,通俗易懂。初学者只要能够认真学通这本书,足以能自由使用C++编写程序,成为C++的高手。C++ Primer对标准C++提供了广泛的介绍,提供了一个思考性的C++学习方案,C++中的重要该概念诸如异常处理、容器类型、面向对象的程序设计等等都体现在字里行间,对语言规则也进行了深入地探讨,是一本非常好的入门也是提高的教程和参考。全书共分为20章,从C++最基本的元素、数据类型到面向过程的程序设计到泛型算法到基于对象与面向对象的程序设计等等,洋洋洒洒,蔚为大观。此书将由中国电力出版社近期推出简体中文版,由潘爱民(《COM原理与应用》的作者,《Visual C++技术内幕(第四版)》、《深入理解COM+》、《COM本质论》、《深入解析ATL》的译者)主译。
在国内,ISO/ANSIC/C++长期被忽视,很多软件公司的招聘广告上写的都是要求熟悉Visual C++或C++Builder——它们简直就成了C/C++的代名词!但ISO/ANSIC/C++有其不可替代的重要性,特别是在软件移植方面,记得我蓝格软件公司的董事长林燕峰先生(KCOM Space的作者)曾经和我说过要保证软件开发的可移植性和开发的可协作管理就必须遵从业界标准。值得庆幸的是今年出版界对标准C/C++书籍的渴求终于重视起来,纷纷出版经典C/C++书籍。关于C/C++的“不学C,无以言”到此已经结束,但并不是说已经囊括了C/C++的全部经典书籍,像Exceptional C++(Herb Sutter著,Addison Wesley Pub Co.,1999年12月第一版)、《实用C语言编程》(Steve Oualli著,O Reilly & Associates,1997年9月第三版,中国电力出版社,2000年5月中文第三版)、《C/C++嵌入式系统编程》(Michael Barr著,O Reilly & Associates,1999年2月第一版,中国电力出版社,2001年3月中文第一版)等等,或因不得见其书、或因技术领域太过专细,皆成明代遗贤。
-
2005-01-27
优秀IT书籍下载集锦100本 - [computer]
[下载]优秀IT书籍下载集锦100本
[下载]优秀IT书籍下载集锦100本
优秀IT书籍下载集锦100本
0. 精彩网址
[url]http://www.cfanclub.net/fav.htm[/url]
1.vc++技术内幕第四版 (潘爱民)
[url]ftp://210.32.157.56/[/url]课件/c++primer/vc++技术内幕IV(潘爱民).rar
2.C++经典对话系列
中文[url]http://www.jka77.com/book/cvst_cn.chm[/url]
3.MFC Windows 程序设计(第二版)
英文版[url]http://www.jka77.com/book/progmfc2.chm[/url]
中文版:暂无,制作中...
4.Effective C++中文版:
[url]http://dlb.pchome.net/development/reference/effectiveCplus.zip[/url]
5.More Effective C++中文版-zhc译
[url]http://cable.pchome.net/development/reference/MEC0410.zip[/url]
6.More Effective C++中文版-候捷译
[url]http://www.nethovel.com/resources/MoreEffectiveC++(WQ).zip[/url]
7.Essential C++中文版(全)-候捷译
[url]http://www.nethovel.com/resources/Essential%20C++[/url]中文版(全).rar
8.深入浅出MFC 2/e
[url]http://218.30.21.125:8084/ebook/programme/mfc2e.zip[/url]
9.代码大全中文版
[url]http://www.delphidevelopers.com/docs/tecsubject/cc/CodeComplet110.zip[/url]
11.C++经典对话系列
中文[url]http://www.jka77.com/book/cvst_cn.chm[/url]
12.MFC Windows 程序设计(第二版)
英文版[url]http://www.jka77.com/book/progmfc2.chm[/url]
中文版:暂无,制作中...
13.数据结构 C++ 语言描述(中文版)
[url]http://www.code-labs.com/manual/c_c015.zip[/url]
14.Java编程思想中文版
[url]ftp://202.118.72.12/pub/doc-book/Java/Java[/url]编程思想.zip
15.C++标准库英文版
[url]ftp://166.111.64.4/incoming/[/url]新文件夹/f/The%20C++%20Standard%20Library(with%20TOC).pdf
16.Windows核心编程
英文[url]http://www.fmdstudio.net/book/prgapps4.zip[/url]
17.TCP-IP详解卷1:协议
[url]ftp://202.204.4.161/[/url]学习资料/TCPIP/TCP-IP详解卷1:协议.pdf
18.TCP-IP详解卷2:实现
[url]ftp://202.204.4.161/[/url]学习资料/TCPIP/TCP-IP详解卷3:TCP事务协议,HTTP,NNTP.pdf
19.TCP-IP详解卷3:TCP事务协议
[url]ftp://202.204.4.161/[/url]学习资料/TCPIP/TCP-IP详解卷2:实现.pdf
20.实用算法的分析与程序设计
[url]ftp://202.204.8.10/[/url][4]%20编程资源/[%20书籍资料%20]/[算法与数据结构]/实用算法的分析与程序设计.rar
21.vc++技术内幕第四版 (潘爱民)
[url]ftp://210.32.157.56/[/url]课件/c++primer/vc++技术内幕IV(潘爱民).rar
22.C++ Primer英文版:
[url]http://computerstep.w18.net/C/C++%20Primer.zip[/url]
23.Effective C++中文版:
[url]http://dlb.pchome.net/development/reference/effectiveCplus.zip[/url]
24.More Effective C++中文版-zhc译
[url]http://cable.pchome.net/development/reference/MEC0410.zip[/url]
25.More Effective C++中文版-候捷译
[url]http://www.nethovel.com/resources/MoreEffectiveC++(WQ).zip[/url]
26.Essential C++中文版(全)-候捷译
[url]http://www.nethovel.com/resources/Essential%20C++[/url]中文版(全).rar
27.Programming Windows程式开发设计指南-Petzoldi著 余孟学 译
中文版[url]http://www.nethovel.com/resources/ProgrammingWindows_tw.chm[/url]
英文版[url]http://www.nethovel.com/resources/Petzoldi.chm[/url]
28.WinAsm32汇编教程- Iczelion
[url]http://www.nethovel.com/resources/winasm.chm[/url]
29.Windows 95 程序设计指南-候捷译
[url]http://www.nethovel.com/resources/win95adg.zip[/url]
30.Thinking in C++ 2nd Edition(C++编程思想)
英文版[url]http://www.nethovel.com/resources/ThinkinginC++.zip[/url]
中文版[url]http://www.dingbing.com/book/thinkc.zip[/url]
31.人月神话-中文版
[url]http://www.goodassister.com/book/rysh.pdf[/url]
32.The C++ Programming Language英文
[url]http://computerstep.w18.net/C/The%20C++%20Programming%20Language.rar[/url]
33.VC技术内幕第五版[url]http://www.helpwork.com/downdata/book/programming/vc/book/vc++2/invcpp5.chm[/url]
34.com技术内幕
[url]http://www.helpwork.com/book/html/user/download.asp?id=1123[/url]
35.com+技术内幕
[url]http://www.helpwork.com/book/html/user/download.asp?id=952[/url]
36.新编 Windows API参考大全
[url]http://www.4046.com/nnsrc/down/WindowsAPIdq.rar[/url]
37.The C programming Language // By Brian W. Kernighan and Dennis M. Ritchie
下载地址[url]http://www.jka77.com/book/The_C_programmin.chm[/url]
38.C语言编程手册
下载地址[url]http://www.jka77.com/book/CL.chm[/url]
39.Delphi 7高效数据库程序设计
By 李维
下载地址[url]http://www.codestudy.net/book/download.asp?id=1163&sort=5[/url]
40.Windows网络编程(第2版)
By Anthony Jones,Jim Ohlund 清华大学出版社
下载地址:英文版[url]http://www.guxiang.com/epubcn/readings/diannaotushu/500/download/1107/network_prog_for_win_2nd.zip[/url]
41.Windows2000编程技术内幕
By Mickey Williams 机械工业出版社
下载地址[url]ftp://ftp.frontfree.net/Pub/Books/C&C++/VC/Windows2000[/url]编程技术内幕.rar
42.数据仓库
By W.H.Inmon 清华大学出版社
下载地址1http://tips.9hao.com/vvbksd/20011120/数据仓库.zip
下载地址2:[url]ftp://ftp.math.nankai.edu.cn/Ebook/China-pub/chinapub_computerscience_multimedia/ComputerScience/%CA%FD%BE%DD%B2%D6%BF%E2/[/url]
43.编码的奥秘
By Charles Petzold 机械工业出版社
下载地址[url]ftp://ftp.math.nankai.edu.cn/Ebook/China-pub/chinapub_computerscience_multimedia/ComputerScience/%B1%E0%C2%EB%B5%C4%B0%C2%C3%D8/[/url]
44.编译原理及实践
By Louden, K.C 机械工业出版社
下载地址[url]ftp://ftp.math.nankai.edu.cn/Ebook/China-pub/chinapub_computerscience_multimedia/ComputerScience/%B1%E0%D2%EB%D4%AD%C0%ED%BC%B0%CA%B5%BC%F9/[/url]
45.Inside C++ Object Model(深度探索C++对象模型)
By Lippman 候捷译
下载地址[url]http://www.jka77.com/book/inside-the-cpp-object-model.pdf[/url]
46.C++标准程序库
By Josuttis
下载地址1http://www.codestudy.net/book/download.asp?id=1205&sort=5
下载地址2:[url]ftp://ftp.math.nankai.edu.cn/Ebook/C_C++/The[/url] Cpp Standard Library.pdf
47.STL源码剖析
By 候捷
下载地址[url]ftp://ftp.math.nankai.edu.cn/Ebook/C_C++/STL[/url]源码剖析--侯捷.pdf
48.C++批判(第三版) -看看C++的坏话!
By I don't know
下载地址[url]http://www.jka77.com/book/CPPPP.pdf[/url]
49.程序设计实践
下载地址[url]ftp://ftp.math.nankai.edu.cn/Ebook/China-pub/chinapub_computerscience_multimedia/%B3%CC%D0%F2%C9%E8%BC%C6%CA%B5%BC%F9/[/url]
50.c++沉思录
By Andrew Koenig Barbara Moo 人民邮电出版社
下载地址[url]http://www.codestudy.net/book/download.asp?id=1261&sort=5[/url]
51.C++Builder4技术内幕 (这本书俺不知道好不好:-))
By I don't Know
下载地址[url]http://www.codestudy.net/book/download.asp?id=1254&sort=5[/url]
52.下面两本书一般大家硬盘里都有的吧,而且很老了,但是为了全面,就提上来吧
(1)Windows 95 程式设计指南 - 候捷
下载地址[url]http://jjhou.csdn.net/win95-a-developers-guide.pdf[/url]
(2)Windows 95 系统程式设计大奥秘 - 候捷
下载地址[url]http://jjhou.csdn.net/windows95-system-programming-secrets.pdf[/url]
53. 中国大百科全书·数学
下载地址[url]ftp://ftp.math.nankai.edu.cn/Ebook/[/url]中国大百科全书/中国大百科全书·数学.pdf
54、4.0M Bjarne Stroustrup - The C++ Programming Language
[url]http://www.u-n-f.com/books/archive/The%20C++%20Programming%20Language.tar.gz[/url]
55、1.0M Richard Stevens - TCP-IP Illustrated
[url]http://www.u-n-f.com/books/archive/TCP-IP%20Illustrated.tar.gz[/url]
56、4.5M Randall Hyde - Art Of Assembly
[url]http://www.u-n-f.com/books/archive/Randall%20Hyde%20-%20Art%20Of%20Assembly.tar.gz[/url]
57、2.1M M. Abrash - Zen of Graphics Programming
[url]http://www.u-n-f.com/books/archive/M.%20Abrash%20-%20Zen%20of%20Graphics%20Programming.zip[/url]
58、249k Kernighan and Ritche - The C Programming Language
[url]http://www.u-n-f.com/books/archive/Kernighan%20and%20Ritchie%20-%20The%20C%20Programming%20Language.zip[/url]
59、3.3M Bruce Schneier - Applied Cryptography
[url]http://www.u-n-f.com/books/archive/Bruce%20Schneier%20-%20Applied%20Cryptography.zip[/url]
60、PHP4_Grundlagen_und_Profiwissen
[url]http://www.u-n-f.com/books/archive/lamp/PHP4_Grundlagen_und_Profiwissen.pdf[/url]
61.《C++ Builder高级编程技术》
[url]http://www.dingbing.com/book/builder.zip[/url]
62.《VC++ 6.0 TLR 模板库参考手册》
[url]http://www.easysea.com/diannao/download/prog/c/mbkc.zip[/url]
63.《BORLAND C++ BUILDER 实用培训教程》
[url]http://202.101.232.120/book/openfile.asp?id=223&filename=BC98_CB526.zip[/url]
64.《Delphi高级开发指南》
[url]http://www.pcbookcn.com/s10899book/program/delphi/Delphi_gjkfzn_for3.rar[/url]
65.《新编 Windows API参考大全》
[url]ftp://book:book@down.pcbookcn.com/pro/delphi/[/url]新编Windows_API_参考大全.rar
66.《Delphi深度历险-附书源码》
[url]http://www.pcbookcn.com/s10899book/program/delphi/Delphi_sdlx_code.rar[/url]
67.《Delphi 7高效数据库程序设计》
[url]ftp://book:book@down.pcbookcn.com/pro/delphi/[/url]李维的新书《Delphi7高效数据库程序设计》.rar
68.《Delphi7开发指南》
[url]ftp://book:book@down.pcbookcn.com/pro/delphi/delphi7[/url]开发指南.rar
69.《Delphi6集成开发环境》
[url]ftp://book:book@down.pcbookcn.com/pro/delphi/Delphi6[/url]集成开发环境.rar
70.《Delphi6数据库编程》
[url]ftp://book:book@down.pcbookcn.com/pro/delphi/Delphi6[/url]数据库编程.rar
72.《Delphi5.xADO_MTS_COM+高级程序设计篇》
[url]ftp://book:book@down.pcbookcn.com/pro/delphi/Delphi5.xADO_MTS_COM+[/url]高级程序设计篇.rar
73.《VISUAL BASIC 编程标准》
[url]http://www.dingbing.com/book/vb.zip[/url]
74.《Visual Basic6.0中文版程序员指南》
[url]http://www.easysea.com/diannao/download/prog/vb/zwbc.zip[/url]
75.《Visual Basic 6.0 控件参考手册》
[url]http://www.easysea.com/diannao/download/prog/vb/kjck.zip[/url]
76.《Visual Basic 6.0中文版语言参考手册》
[url]http://www.easysea.com/diannao/download/prog/vb/zwby.zip[/url]
77.《Visual Basic 6.0 开发宝典》
[url]http://www.easysea.com/diannao/download/prog/vb/kfbd.zip[/url]
78.《Visual Basic 6.0 实例教程》
[url]http://www.easysea.com/diannao/download/prog/vb/sljc.zip[/url]
79.《VB 6.0 中文版实用参考手册》
[url]http://www.easysea.com/diannao/download/prog/vb/syck.zip[/url]
80.《Visual Basic 6开发人员指南》
[url]http://www.easysea.com/diannao/download/prog/vb/kfzn.zip[/url]
81.《VB 和 SQL Server 编程指南(第五版)》
[url]http://www.easysea.com/diannao/download/prog/vb/bczn.zip[/url]
82.《Jbuilder 5 中文帮助》
[url]http://www.pdown.net/download.asp?downid=2&id=991[/url]
83.《JBuilder开发人员指南》
[url]http://youth.dlmu.edu.cn/book/list_down.php?bkid=224[/url]
84.《Win32的Internet函数说明》
档案大小: 245248K
[url]http://www.easysea.com/diannao/download/prog/windows/win32int.zip[/url]
85.《Visual InterDev 从入门到精通》
[url]http://www.easysea.com/diannao/download/prog/interdev/crmd.wdl[/url]
86.《Visual InterDev 6.0 Web 参考手册 》
[url]http://www.easysea.com/diannao/download/prog/interdev/jsck.zip[/url]
87.《Visual InterDev 6.0 Guide 程序员》
[url]http://www.easysea.com/diannao/download/prog/interdev/cxyz.zip[/url]
88.《javascript 程序开发手册》
[url]http://www.cty99.com/Templet/bookdownmore.asp?booktype=script#[/url]
89.《JAVA 大全》
[url]http://www.easysea.com/diannao/download/prog/java/cxkf.zip[/url]
90.《Visual J++ 6.0 WFC 类库参考手册》
[url]http://www.easysea.com/diannao/download/prog/java/lkck.zip[/url]
91.《Java联想(中文)》
[url]http://www.easysea.com/diannao/download/prog/java/lkck.zip[/url]
92.《Oracle 8 实用大全》
[url]http://www.easysea.com/diannao/download/prog/oracle/sydq.zip[/url]
93.《Microsoft SQL Server 管理员手册》
[url]http://www.easysea.com/diannao/download/prog/sql/glys.zip[/url]
94.《掌握ACCESS开发》
[url]http://www.easysea.com/diannao/download/prog/sql/glys.zip[/url]
95.《Oracle Performance Tuning and Optimization》
[url]http://www.oradb.net/book/oracle_pt.zip[/url]
96.《Oracle ProC 程序设计》
[url]http://www.oradb.net/book/oracleproc.zip[/url]
97.《Oracle8初学者指南》
[url]http://www.easysea.com/diannao/download/prog/oracle/cxzz.zip[/url]
98.《RED HAT LINUX 6大全》
[url]http://www.dingbing.com/book/redhatall.zip[/url]
99.《RED HAT LINUX 6管理工具》
[url]http://www.dingbing.com/book/redhatman.zip[/url]
100.《VC++高级编程》
[url]http://www.easysea.com/diannao/download/prog/c/vcgj.zip[/url]
-
真实的C++之父
——Bjarne Stroustrup访谈录
赵玉勇
Bjarne Stroustrup简介
图Bjarne Stroustrup先生在他的办公室,这是他的个人网站上的相片
许多重要人物之所以成名,或者是因为其改变了历史或者是因为其创造了历史,Bjarne Stroustrup先生,C++之父,属于后者;归结个人成功的原因,理由可能有许多,但他只有浅显的两个一点点:他比多数人天真和理想主义那么一点点;比多数人花在解决问题上的时间多一点点。
C++程序设计语言是一种承前启后,被数以百万计的程序员应用在各个领域中的语言,我们正在使用的Windows操作系统,我们上网用的浏览器IE无不是出自C++的手笔。
C++是一种重要的和比较流行的计算机语言之一,也是未来十年内仍然发挥重要作用的语言。C++语言是一种通用的应用广范的程序设计语言,是一种既支持传统的结构化程序设计,又支持面向对象程序设计的系统复杂的语言。C++对C语言的扩充首先由 Stroustrup先生于1980年在贝尔实验室提出的,于1983年改名为C++。尽管C++的祖先C语言是世界上最受喜爱和应用最广的专业程序设计语言之一,但C++的发明是必需的。C++的本质就是让程序员理解和管理更大更复杂的程序。而对这种语言有着最大贡献的C++之父又是怎样一个人呢?
Bjarne Stroustrup先生,1950年生于丹麦港口城市奥尔胡斯,1975年在奥尔胡斯大学毕业,1979年获得剑桥大学计算机科学博士学位。他是C++语言的设计者和实现者,现在是得克萨斯州A&M大学计算机系教授。1979年他来到美国的新泽西州并加入贝尔实验室,与C语言之父、1983年图灵奖得主Dennis Ritchie以及大名鼎鼎的Brian Kernighan(两人合著《C程序设计语言》)共事多年,期间参与了贝尔实验室的C语言标准化活动。他的研究兴趣十分广泛,包括分布式系统、操作系统、仿真、设计以及编程,Bjarne还积极推动C++的ANSI/ISO标准化。
20世纪90年代以后,Bjarne Stroustrup步入人生的最辉煌时期。
1990年,Bjarne荣获《财富》杂志评选的“美国12位最年轻的科学家”称号。
1993年,由于在C++领域的重大贡献,Bjarne获得了ACM该年度的 Grace Murray Hopper大奖并成为ACM院士(成立于1947年的ACM协会是历史最悠久、目前世界上最大的教育和科学计算协会,成为ACM院士是个人成就的里程碑)。
1995年,BYTE杂志颁予他“近20年来计算机工业最具影响力的20人”的称号。
除了他的专业研究领域外,他对历史,通俗文学,摄影,运动,旅行和音乐等有广泛的兴趣。他对C++语言的推广也做出了极大的贡献,他写的书“The C++ Programming Language《C++程序设计语言》”已经成为这种语言中最为流行的学习资料,至少被翻译成18种语言。
给中国程序员最美好的祝愿
2004年12月8日,杭州,C++之父Bjarne Struostrup先生再次来到中国。我们有幸采访到了这位大师!请看大师给中国程序员的最美好祝愿。
问: 您对中国和中国的程序员有什么认识?您想对他们说点什么吗?
Bjarne Stroustrup:中国是个大国,并且她有许许多多有趣的文化。我想和中国程序员说的和对其他国家的程序员说的是一样的,所以我有如下的回答:优秀软件所具有的特点和技术在全世界都是通用的。
图 C++之父给中国程序员最美好的祝愿
现在,成为一名电脑高手是许多年轻学生的梦想,面对Stroustrup这样一位大师级人物的出现,最令我们感兴趣的问题莫过于:Bjarne成为大师的历程是什么样子的呢?
Bjarne Stroustrup先生出生的奥尔胡斯市是日德兰半岛东海岸的一个美丽的小城,那里每家都有自己的小公寓,公寓里有个小院,小院是孩子们踢足球的地方,那时,成为一名足球明星比成为一名电脑高手是更可行的想法,做一名电脑名星好象是很遥远的事情,因为个人不太可能拥有一台昂贵的计算机。很幸运,在大学时他就用上了系里的计算机,它叫GIER,是一台旧的丹麦计算机,有一个房间那么大,程序都写在磁带上面,他用它学习Algol 60程序设计。
而对Bjarne生活产生质的变化的事情是什么呢?
他认为在他的发展生涯中,最关键的一个项目是在剑桥大学攻读博士学位时用Simula67计算机做的模拟分布式系统。做这个项目除了使他成为一名顶尖的程序设计高手外,更使他养成了程序员应具有的沟通和交流能力,这为他后来的发展奠定了坚实的基础。
B与C
Bjarne和C有缘。
Bjarne Stroustrup先生和C(China中国)有缘,对他来说中国是一个神秘、美丽而有趣的国度。
Bjarne两度亲密接触中国,第一次是2002年,曾在中国的几所大学讲学,而第二次是在浙江大学参加ICESS国际会议(ICESS 2004, http://www.cs.zju.edu.cn/icess2004/)。Bjarne Stroustrup先生两年前在中国有过长时间的旅程,而在杭城的日子恰逢阴雨,这次到来对晴天的期望是强烈的,何况有杭州西湖美景。作为丹麦人,也就是卖火柴的小女孩诞生的地方,也就是安徒生童话诞生的国度,和中国有着很深的渊源,安徒生童话里恰巧里面有一篇《夜莺》,那里写到了中国,而Bjarne Stroustrup先生对于C(中国)的认识又是什么呢?
他的回答很微妙,他自然知道安徒生童话,他也很喜欢它们,《夜莺》中描绘的中国纯是虚构,与当时的中国可能有也可能没有任何关系,安徒生创造了那个“中国”来泛指多个国家及其统治者。而作为一个教育者,他对中国的教育老祖师孔老夫子也有自己独到的见解。
作为第二个C,自然就是C++了。勿庸置疑,C++对于IT的分量,和对于Bjarne个人的影响,都是巨大的。还有一个C,就是计算机,且看下面他如何描述自己与计算机的联系。
问: 您的生活是怎样和计算机联系在一起的?
Bjarne Stroustrup:我也不晓得自己到底是怎样和计算机联系在一起的。当我上高中时,不知什么原因总觉得计算机科学是数学的某种实用形式。而事实不完全是这样,或者至少从软件的发展上看并不是如此,但正是这种误解使得我在还不知计算机为何物时选择了 “计算机科学数学” ,作为我学习的专业,并获得了我的硕士学位。我写完第一个程序后,就着了迷,曾没有回过头。正象大家所看到的,很幸运,我找到了一个使自己的才能可以很好地发挥的位子。
问:您怎样教育自己的孩子和学生们?您对孔夫子有什么看法?孔子是中国古代的伟大教育家。
BS:多数情况下,我是通过实例来进行教学的。我认为多数人过高的估计了言语的影响力,而过低的估计了这种影响力是怎样达到的过程。我尽量通过把理论和实践相结合起来以更好地达到目的,这样可以比仅用理论或仅用实践示例来教育更能取得事半功倍的成效。我尽量举出实例,从这些活生生的实例中引导归纳出一般的规则和概念。
关于孔子的问题,到目前为止是你问的最棘手的问题。自然,我不是一个孔子问题专家,但是我曾经访问过中国并且我比其它西方非孔子研究者读过更多的关于中国历史的书,但事实上关于孔子的影响力,人们对他有不同看法,他的教育我也知之甚少。当然,我最喜欢他的“人合”的观念,但是就我个人的感觉而言,他的观点有点僵化呆板,权威化,太过于等级化,并且太注重传统的形式,同时他还强调建立一个有秩序的国家,这很容易把人仅仅按照事先定好的地位来对待,并且把个人仅仅看作他的性别,年龄,和等级等的一个代表。这有很大的局限性,我还认为和我的注重实例,实验的,和科学的教学观念相比他过分的强调道德,书本的学习和对人的控制。我希望我的这种评价不会对孔夫子不公。如果你认为我误解了他,请不要太介意,这种曲解更大程度上是无知而不是恶意造成的。当然孔子的思想也是可以理解的,毕竟2500年以前没有人对经验,技能和科学象今天的人理解的这样清楚,因此他们注重道德,统治和社会机制。
我不知这些观念被译成汉语会被怎么看待,但是我更注重个性化和实效的方法,但也不是所谓的忘我或者不负责任,每个人都应该尽力为他的家庭、国家和整个世界争取福利而不是从中索取,我们应该在我们离开世界时感到比我们以前看到的更好。
C++是怎样炼成的,是什么促成了C++语言?这象迷一样绕在我们的心头;那什么又是计算机语言呢?后者弄懂了,前者看起来也许就更简单了!且看大师的回答:
问: 您觉得计算机语言和我们人类的语言有什么不同呢?
Bjarne Stroustrup:计算机语言要比人类语言简单的多,并且精确的多,那也是它应该具有的方式。我不赞成用自然语言去指令电脑的想法。一种程序语言是专家们的工具,并且和普通人相比,是对所有的专家来说用更加专业、定义的更加精确的符号和术语来表达的工具。
当然两者也有相同之处。那些用的较多的语言比那些使用率较小的语言拥有更多的俗语、表达方式、词汇,这一点无论是计算机语言还是自然语言都是一样的。语言还有一个倾向就是越来越易学,但却很难精通,象C++和英语。在两种语言当中,我们都希望能从最初的基本的应用到真正的掌握。另外一个相同之处就是语言的发展都要适应一个群体的需求,并且一个大的群体或者说社区本身就有重要意义,因为作为这个群体的一部分可以让你有更多的人来进行互动并且有更多的机会可以使用。所有鲜活的语言都是通过获得新的术语、俗语和表达方式来得到发展的。在C++中我们已经看到了关于模板技术的迅猛发展,始因是STL(注:STL指标准模板库,后面我们将采访STL之父Stepanov先生,他确实有许多精彩的言论,和Bjarne Stroustrup先生相比,毫不逊色),也就是经常提到的泛型编程(generic programming)和模板元程序(template metaprogramming)。以后几年里,我们将会在新的ISO C++标准中看到,比1998年标准中对模板技术更强的支持和更广的应用。
那么,究竟是什么促成了C++语言呢?
他的研究生涯给了他很大灵感,他所在的AT&T贝尔实验室是一个光荣的群体,那里有一群非常出色的研究人员,那里有许多著名的IT人物,他们彼此间的影响十分深远。他曾经和C语言之父Dennis Ritchie亲密接触十多年,他们的办公室相距不远,C++语言受C的影响是巨大的。而对于C++来说,尤其值得我们推崇的是:作为一种学术性语言,他是从商业性语言的重围中杀出的。
1979年Bjarne在剑桥完成学业后,到了贝尔实验室从事研究工作,20世纪80年代,AT&T曾拔款5000美元作为市场预算,创建一门语言的决心可能由此而始。在那里,开始研究几个与分布式计算有关的项目。可是工作进展得并不顺利,因为那时几乎所有程序设计工具都不适合完成此类工作。所以,他决定自己开发一个名为“带类的C”的工具,它既允许以类似于Simula的方式组织程序(这种方式现在被称为面向对象),同时也支持在硬件层次上进行系统软件开发。从1980年开始,“带类的C”被应用于贝尔实验室的很多应用领域,在应用过程中,他又学到了很多东西,而C++正是以“带类的C”为基础并结合了一些我们学到的新东西发展而来的。1983年夏天,Rick Mascitti给起了C++的名字,这个名字也象征着两种语言之间巨大的渊源。
生活中更有意义的事情
对于Bjarne来说,生活中更有意义的事情是什么呢?是学习和教育。这看起来象个沉重的话题,而在Bjarne身上却显得如此生动,作为教育家,Bjarne Stroustrup先生本身便是一个成才的典范,他出身于农场和“蓝领工人”家庭,他在专业领域孜孜耕耘,取得了不菲业绩。先是AT&T的研究者,现在又兼任教席,Bjarne从研究室又走进了大学,直接面对大学的新学生!
C++是Bjarne生命中最重要的事情,而还有一些更有意义的事情。
他对大学教育情有独衷,他现在是A&M大学的教授,这种行动便是很好的说明,在这里,以一种在AT&T研究所中无法采用的方式将研究和教学结合起来。他认为教学是一种与工业生产不同的能影响世界并使其变得更加美好的方式,而且大学里的研究工作的成果与曾经进行的工业研究的并不相同 - 不是说它更好,仅仅只是不同而已。
他的一些教育观点也非常值得我们深思:
他说,不要只学习计算机和编程,要积累一种或多种领域的经验,要有其他专业知识,这样就能明白什么东西值得我们去编程实现。另外,学习多种语言也是他一再强调的,如果只学一种,容易导致想象力的僵化。他本人爱好广范,精通多种计算机语言。
图 摄影者的风景
问:您觉得怎样才是学编程的好方法?学习语言时一种好的工具是不是必需的?
Bjarne Stroustrup: 这是过去一年左右里一直占据我大部分注意力的一个问题。我志愿教授电子工程/计算机工程专业大学一年级的学生编程,我认为我们目前教编程的传统方法不够严谨也不够广阔。我们社会的文明进步是建立在软件上的,因而必须培养更好的软件专家。我认为已经到了我开始培养新手程序员的时候了,在我此之前我都是把精力放在专家上。我基本的设想是让学生成为专家,使他们最终能够编出可靠并且别人可以信赖的软件,这就意味着在培养新手时要求更高,要将重点放在对程序正确性和处理错误的训练上。既然目标是为了制造现实世界中可用的软件,我也非常重视标准库的应用和设计。对于C++标准库工具的教学,例如向量(vector)和字符(string)从第一周就该开始应用,在第一个月之内类(class)就应该介绍,在第二个月之内介绍图形(graphics)和继承性(inheritance)。这种方法和传统的方法不同,那些教学方法往往花费数周的时间来区分那些令人迷惑的C++基本类型,并且浪费宝贵的时间来处理诸如声明和循环上的一些迷人耳目的语法细节。我称我的方法为“深度优先法”,因为我们首先教我们的学生足够的知识去做一些有用的工作,然后才在这有限的基础上拓宽他们的理解能力和对工具的使用能力。
我所有的教学都是在实例的基础上进行的。我通过典型的例子来使学生理解,用亲身的体会来解释一些规则。自然地,我要求学生写大量代码—如果你不读也不写大量代码的话你就学不会编程。第一阶段如下,学生必须经过亲身写代码,体会解题过程中出现的实际问题;第二个阶段必须好好体会亲身所犯的错误,并且学会克服他们。这其中,调试、错误处理,还有学会将大问题分解成小问题,从最小的组件来编程是非常重要的。
问:数学和计算机科学有什么关系吗?
Bjarne Stroustrup: 两者并没有很强的直接联系,但是有一部分编程的实质包含在里面---象学数学一样,编程有时也需要很严密的思维。自从古希腊以来,数学就被用来训练人们的逻辑思维,并且我觉得如果不用数学的话很难想象怎样才能编出好程序来。当然也有一些计算机领域,用到高深的数学知识。然而,这些领域通常是非常专业的。数学,特别是数学思维是计算机的一个支柱。经验主义是另一支柱,通过观察和测量来帮助理解实际的发展,用以调整我们的系统和行为。两方面我们都需要。计算机科学不是仅仅用来证明定理的,也不是仅仅用来收集数据的。为了有效地实践计算机科学和发展高质量软件,更同时需要数学和经验的训练。
问: 您以前在欧洲学习而现在在美国工作,您觉得欧美有什么学术传统区别?怎样才算是一种好的大学教育呢?尤其对计算机科学来说。现在的大学有部分学生中途退学,您怎样看待这一现象呢?
Bjarne Stroustrup:这很难回答。欧洲和美国都幅员辽阔,而且有很多不同的学术传统。真的不好总结,并且在两地都有一些非常好的大学科系,这不是很容易区别和下结论的。
很少有学生离开学校去开公司,较多的是离开学校去从事一些有较高收入的工作,但大多数人还是完成了学业。我印象中那些放弃了计算机科学学习转而投入业界工作的是会为此感到后悔的。从长期眼光来看学位对一个好工作来说是重要的,特别是学生在他们最后一年或最后几年的学习。当然也确实有些相反的例子,但那些人通常永远不会再从事真正的技术工作,而转为商业管理人员了,如果那是他们想做的,那一个学位并不是必须的。我一直认为:一个学生如果还未获得学位,最好不要离开学校。
问:我们经常批评我们现在的C++教育不够现代、不够科学,您是通过“深度优先法”来教授学生的,您是否觉得在一个学生学习早期有些难吗?我们该如何做呢?
Bjarne Stroustrup:这是必然的。传统的教授编程的方法是不行的,学完这些课程的学生写不出很好的代码。说得更激进一点,他们甚至不知道什么是好的代码!我的方法可以避免这种情况发生。我已在300名学生身上实验成功。对于程序员来说这是非常关键的——包括新程序员——了解基本概念和基本技能。但仅仅了解程序设计语言的基本构造是不够的。另一方面,如果没有一种编程语言我们就不可能教授编程的技能和规则,因此,对一种语言工具充分掌握,做尽可能多的练习是必需的。
很显然,这种教育问题不仅仅局限于C++语言。我的方法可以应用于任何其他语言。
面向金钱、面向未来和面向对象
面向对象是个有趣的问题,C++正是和面向对象有着非常联系的语言,作为一种非商业化语言,他已经影响了世界范围数十亿美元的设计决策。而还有许多语言具有这种特点,因而,关于各种语言的争论喋喋不休地进行了几十年。
当有人问Bjarne Stroustrup先生:有人说Java是纯粹面向对象的,而C#更胜一筹,而还有很多人说它们纯粹是面向金钱的。以您之见呢?
Bjarne的回答非常风趣:我喜欢“面向金钱”这个词 :-) 还有Andrew Koenig的说法"面向大话"我也喜欢。C++可不面向这两个东东。对这点我还想指出,我认为纯粹性并非什么优点。C++的优点恰恰在于其支持多种有效的编程风格(多种思维模型吧,如果你一定要这么说)及其组合。最优雅最有效也最容易维护的解决方案常常涉及到一种以上的风格(编程模型)。如果一定要用吸引人的字眼,C++是一种多思维模型的语言。在软件开发的庞大领域,需求千变万化,起码需要一种支持多种编程的设计风格的通用语言,而且很可能需要一种以上呢。再说,世界之大,总容得下好几种编程语言吧?那种认为一种语言对所有应用和每个程序员都是最好的看法,根本就是荒谬的。
他上面的回答很好地告诉了我们面向对象和面向金钱的关系,也给我们的争论划上了圆满的句号。
问:您对面向对象是怎样理解的?它是不是一种好的可接受的编程思考方式?有没有学习OO必须的有用的工具?
Bjarne Stroustrup:OO技术在现在软件发展的扮演了非常重要的角色,但并不是唯一的方法。象泛型程序设计(generic programming),用C++ 模板是另一种方法,这些方法必须通过综合应用来,才能创造出:一流的、最可读的、最易于维护的、最高效的程序。但没有任何一种方法是适合所有要求的。
我主要用C++来编程。我觉得C++是一种学习和实践OO思想很好的编程语言。
图 敢问路在何方
问: 您能对IT的将来做一下预测吗?将来我们最有可能用什么语言?
Bjarne Stroustrup:一个聪慧的幽默大师曾经说过:预测是困难的,特别是对将来的预测。但是我认为未来十年之内我们用的东西在今天的实验室里是能够看到的。另外我们将用的最主要的语言也是今天最主要的。我们不可能因为一些新东西和一些更好的东西的出现就重组整个工业领域,因此在五到十年之内,我们还是用C, C++, COBOL, Fortran, Java, Perl, Python,也许还有C#,和其它许多种语言。没有一种语言能适合所有用途,并且好的程序员都懂并且都能用好几种语言。懂好多种语言和多种程序设计技术会使我们可以更好地编程。
对于IT我不想说太多,很显然:我们会继续依赖IT并且它会延伸到越来越多的领域。当然,肯定会有失败,通常是因为过度的滥用引起的——但是在十年以后我们受IT的影响肯定要比今天大得多。
人物印象
图:作者和Bjarne Stroustrup先生合影
很幸运,通过电邮采访的同时终于有机会和大师面对面。想象中的大师和面对面见到的有太多的意想不到,用一个词来形容是“谦逊”。
Bjarne到杭州下了飞机,便扑向美丽的西湖,同去的是他的好友STL之父Alex Stepanov先生。在未去杭州之前,Bjarne Stroustrup先生通过电邮告诉我杭州城的美;去了之后,少有的好天气让我们碰上了,爽;夜里在旅馆见到了久违的大师,一夜之间见到两位大师,更爽!
我对Bjarne Stroustrup先生有着特殊的感情,觉得他象位慈父,而他正和我的父亲同样的年纪。大师,慈父!接触越多,对Bjarne Stroustrup先生的感触越深。到了杭城,见到大师其人,这种感觉越来越浓厚,他又象海,既有热情,又能包容。
采访大部是通过E—mail进行的,采访的过程中对我的问题孜孜以求,给我的回答细微备至,E—mail的好处在此发挥到了极致,大洋这边的我沐着阳光,那边的他在挑灯夜书。
唯有谢谢众多C++程友和非C++朋友对我的支持,唯有大师再来杭城时,到最好的茶馆将上好的龙井泡上,亲手送到大师的手中!
2004年12月19



各种各样的Spammer已经到了让人深恶痛绝的地步,各种反Spam的手段也层出不穷。现在Lycos Europe所推出的这个屏幕程序更绝,以DDoS攻击的方式来对付Spammer。这个屏幕保护程序在运行的时候会向Spam发送者的网络服务器发送请求,当有很多用户同时使用这个屏幕保护程序的时候,就可以达到阻塞Spam服务器带宽的目的。这个屏幕保护程序的标语也很有意思:"Make LOVE not SPAM"。





