分类归档: Programming

编程编程编程。。。

10年编程无师自通

原文:Teach Yourself Programming in Ten Years
作者:Peter Norvig
翻译:郭晓刚(foosleeper@163.net)
最后修订日期:2004-3-19
2005-01-12增加了新的译本链接。

本中文译本得到了Peter Norvig的许可。

为什么每个人都急不可耐?

走进任何一家书店,你会看见《Teach Yourself Java in 7 Days》(7天Java无师自通)的旁边是一长排看不到尽头的类似书籍,它们要教会你Visual Basic、Windows、Internet等等,而只需要几天甚至几小时。我在Amazon.com上进行了如下搜索:
pubdate: after 1992 and title: days and (title: learn or title: teach yourself)
(出版日期:1992年后 and 书名:天 and (书名:学会 or 书名:无师自通))
我一共得到了248个搜索结果。前面的78个是计算机书籍(第79个是《Learn Bengali in 30 days》,30天学会孟加拉语)。我把关键词“days”换成“hours”,得到了非常相似的结果:这次有253本书,头77本是计算机书籍,第78 本是《Teach Yourself Grammar and Style in 24 Hours》(24小时学会文法和文体)。头200本书中,有96%是计算机书籍。
结论是,要么是人们非常急于学会计算机,要么就是不知道为什么计算机惊人地简单,比任何东西都容易学会。没有一本书是要在几天里教会人们欣赏贝多芬或者量子物理学,甚至怎样给狗打扮。
让我们来分析一下像《Learn Pascal in Three Days》(3天学会Pascal)这样的题目到底是什么意思:

* 学会:在3 天时间里,你不够时间写一些有意义的程序,并从它们的失败与成功中学习。你不够时间跟一些有经验的程序员一起工作,你不会知道在那样的环境中是什么滋味。简而言之,没有足够的时间让你学到很多东西。所以这些书谈论的只是表面上的精通,而非深入的理解。如Alexander Pope(译注:英国诗人、作家,1688-1744)所言,一知半解是危险的(a little learning is a dangerous thing)

* Pascal:在3 天时间里你可以学会Pascal的语法(如果你已经会一门类似的语言),但你无法学到多少如何运用这些语法。简而言之,如果你是,比如说一个Basic程序员,你可以学会用Pascal语法写出Basic风格的程序,但你学不到Pascal真正的优点(和缺点)。那关键在哪里?Alan Perlis(译注:ACM第一任主席,图灵奖得主,1922-1990)曾经说过:“如果一门语言不能影响你对编程的想法,那它就不值得去学”。另一种观点是,有时候你不得不学一点Pascal(更可能是Visual Basic和java script之类)的皮毛,因为你需要接触现有的工具,用来完成特定的任务。但此时你不是在学习如何编程,你是在学习如何完成任务。

* 3天:不幸的是,这是不够的,正如下一节所言。

10年编程无师自通

一些研究者(Hayes、Bloom)的研究表明,在许多领域,都需要大约10 年时间才能培养出专业技能,包括国际象棋、作曲、绘画、钢琴、游泳、网球,以及神经心理学和拓扑学的研究。似乎并不存在真正的捷径:即使是莫扎特,他4 岁就显露出音乐天才,在他写出世界级的音乐之前仍然用了超过13年时间。再看另一种音乐类型的代表–披头士,他们似乎是在1964年的Ed Sullivan节目中突然冒头的。但其实他们从1957年就开始表演了,即使他们很早就显示出了巨大的吸引力,他们第一次真正的成功之作《Sgt. Peppers》也要到1967年才发行。Samuel Johnson(译注:英国诗人)认为10 年还是不够的:“任何领域的卓越成就都只能通过一生的努力来获得;稍低一点的代价也换不来。” (Excellence in any department can be attained only by the labor of a lifetime; it is not to be purchased at a lesser price.) 乔叟(译注:Chaucer,英国诗人,1340- 1400)也抱怨说:“生命如此短暂,掌握技艺却要如此长久。”(the lyf so short, the craft so long to lerne.)
下面是我在编程这个行当里获得成功的处方:

* 对编程感兴趣,因为乐趣而去编程。确定始终都能保持足够的乐趣,以致你能够将10年时间投入其中。

* 跟其他程序员交谈;阅读其他程序。这比任何书籍或训练课程都更重要。

* 编程。最好的学习是从实践中学习。用更加技术性的语言来讲,“个体在特定领域最高水平的表现不是作为长期的经验的结果而自动获得的,但即使是非常富有经验的个体也可以通过刻意的努力而提高其表现水平。”(p. 366),而且“最有效的学习要求为特定个体制定适当难度的任务,有意义的反馈,以及重复及改正错误的机会。”(p. 20-21)《Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life》(在实践中认知:心智、数学和日常生活的文化)是关于这个观点的一本有趣的参考书。

* 如果你愿意,在大学里花上4年时间(或者再花几年读研究生)。这能让你获得一些工作的入门资格,还能让你对此领域有更深入的理解,但如果你不喜欢进学校,(作出一点牺牲)你在工作中也同样能获得类似的经验。在任何情况下,单从书本上学习都是不够的。“计算机科学的教育不会让任何人成为内行的程序员,正如研究画笔和颜料不会让任何人成为内行的画家”,Eric Raymond,《The New Hacker’s Dictionary》(新黑客字典)的作者如是说。我曾经雇用过的最优秀的程序员之一仅有高中学历;但他创造出了许多伟大的软件,甚至有讨论他本人的新闻组,而且股票期权让他达到我无法企及的富有程度(译注:指Jamie Zawinski,XEmacs和Netscape Navigator的作者)。

* 跟别的程序员一起完成项目。在一些项目中成为最好的程序员;在其他一些项目中当最差的一个。当你是最好的程序员时,你要测试自己领导项目的能力,并通过你的洞见鼓舞其他人。当你是最差的时候,你学习高手们在做些什么,以及他们不喜欢做什么(因为他们让你帮他们做那些事)。

* 接手别的程序员完成项目。用心理解别人编写的程序。看看在没有最初的程序员在场的时候理解和修改程序需要些什么。想一想怎样设计你的程序才能让别人接手维护你的程序时更容易一些。

* 学会至少半打编程语言。包括一门支持类抽象(class abstraction)的语言(如Java或C++),一门支持函数抽象(functional abstraction)的语言(如Lisp或ML),一门支持句法抽象(syntactic abstraction)的语言(如Lisp),一门支持说明性规约(declarative specification)的语言(如Prolog或C++模版),一门支持协程(coroutine)的语言(如Icon或Scheme),以及一门支持并行处理(parallelism)的语言(如Sisal)。

* 记住在“计算机科学”这个词组里包含“计算机”这个词。了解你的计算机执行一条指令要多长时间,从内存中取一个word要多长时间(包括缓存命中和未命中的情况),从磁盘上读取连续的数据要多长时间,定位到磁盘上的新位置又要多长时间。(答案在这里。)

* 尝试参与到一项语言标准化工作中。可以是ANSI C++委员会,也可以是决定自己团队的编码风格到底采用2个空格的缩进还是4个。不论是哪一种,你都可以学到在这门语言中到底人们喜欢些什么,他们有多喜欢,甚至有可能稍微了解为什么他们会有这样的感觉。

* 拥有尽快从语言标准化工作中抽身的良好判断力。

抱着这些想法,我很怀疑从书上到底能学到多少东西。在我第一个孩子出生前,我读完了所有“怎样……”的书,却仍然感到自己是个茫无头绪的新手。30个月后,我第二个孩子出生的时候,我重新拿起那些书来复习了吗?不。相反,我依靠我自己的经验,结果比专家写的几千页东西更有用更靠得住。
Fred Brooks在他的短文《No Silver Bullets》(没有银弹)中确立了如何发现杰出的软件设计者的三步规划:

1. 尽早系统地识别出最好的设计者群体。

2. 指派一个事业上的导师负责有潜质的对象的发展,小心地帮他保持职业生涯的履历。

3. 让成长中的设计师们有机会互相影响,互相激励。

这实际上是假定了有些人本身就具有成为杰出设计师的必要潜质;要做的只是引导他们前进。Alan Perlis说得更简洁:“每个人都可以被教授如何雕塑;而对米开朗基罗来说,能教给他的倒是怎样能够不去雕塑。杰出的程序员也一样”。
所以尽管去买那些Java书;你很可能会从中找到些用处。但你的生活,或者你作为程序员的真正的专业技术,并不会因此在24小时、24天甚至24个月内发生真正的变化。

参考文献

Bloom, Benjamin (ed.) Developing Talent in Young People, Ballantine, 1985.
Brooks, Fred, No Silver Bullets, IEEE Computer, vol. 20, no. 4, 1987, p. 10-19.
Hayes, John R., Complete Problem Solver, Lawrence Erlbaum, 1989.
Lave, Jean, Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life, Cambridge University Press, 1988.

答案

各种操作的计时,2001年夏天在一台典型的1GHz PC上完成:
执行单条指令            1 纳秒 = (1/1,000,000,000) 秒
从L1缓存中取一个word        2 纳秒
从主内存中取一个word        10 纳秒
从连续的磁盘位置中取一个word    200 纳秒
从新的磁盘位置中取一个word(寻址) 8,000,000纳秒 = 8毫秒

脚注

T. Capey指出Amazon上面《Complete Problem Solver》的页面中,《Teach Yourself Bengali in 21 days》和《Teach Yourself Grammar and Style》被列在了“购买此书的顾客还买了以下书籍”栏目里面。我猜其中一大部分察看这两本书的人都是从我这里过去的。

译本

感谢以下作者将本文翻译成其他语言:
日文(Yasushi Murakawa),中文(郭晓刚),繁体中文(Jason Chen),西班牙文(Carlos Rueda),德文(Stefan Ram),法文(P. E. Allary),土耳其文(?a??l Ulu?ahin)。

Peter Norvig (Copyright 2001)

Read: 553

优秀IT书籍100本

1.vc++技术内幕第四版 (潘爱民)
ftp://210.32.157.56/课件/c++primer/vc++技术内幕IV(潘爱民).rar
2.C++经典对话系列
中文:http://www.jka77.com/book/cvst_cn.chm

3.MFC Windows 程序设计(第二版)
英文版:http://www.jka77.com/book/progmfc2.chm
中文版:暂无,制作中…
4.Effective C++中文版:
http://dlb.pchome.net/development/reference/effectiveCplus.zip
5.More Effective C++中文版-zhc译
http://cable.pchome.net/development/reference/MEC0410.zip

6.More Effective C++中文版-候捷译
http://www.nethovel.com/resources/MoreEffectiveC++(WQ).zip

7.Essential C++中文版(全)-候捷译
http://www.nethovel.com/resources/Essential%20C++中文版(全).rar

8.深入浅出MFC 2/e
http://218.30.21.125:8084/ebook/programme/mfc2e.zip

9.代码大全中文版
http://www.delphidevelopers.com/docs/tecsubject/cc/CodeComplet110.zip

11.C++经典对话系列
中文:http://www.jka77.com/book/cvst_cn.chm

12.MFC Windows 程序设计(第二版)
英文版:http://www.jka77.com/book/progmfc2.chm
中文版:暂无,制作中…

13.数据结构 C++ 语言描述(中文版)
http://www.code-labs.com/manual/c_c015.zip

14.Java编程思想中文版
ftp://202.118.72.12/pub/doc-book/Java/Java编程思想.zip

15.C++标准库英文版
ftp://166.111.64.4/incoming/新文件夹/f/The%20C++%20Standard%20Library(with%20TOC).pdf

16.Windows核心编程
英文:http://www.fmdstudio.net/book/prgapps4.zip

17.TCP-IP详解卷1:协议
ftp://202.204.4.161/学习资料/TCPIP/TCP-IP详解卷1:协议.pdf

18.TCP-IP详解卷2:实现
ftp://202.204.4.161/学习资料/TCPIP/TCP-IP详解卷3:TCP事务协议,HTTP,NNTP.pdf

19.TCP-IP详解卷3:TCP事务协议
ftp://202.204.4.161/学习资料/TCPIP/TCP-IP详解卷2:实现.pdf

20.实用算法的分析与程序设计
ftp://202.204.8.10/[4]%20编程资源/[%20书籍资料%20]/[算法与数据结构]/实用算法的分析与程序设计.rar

21.vc++技术内幕第四版 (潘爱民)
ftp://210.32.157.56/课件/c++primer/vc++技术内幕IV(潘爱民).rar

22.C++ Primer英文版:
http://computerstep.w18.net/C/C++%20Primer.zip

23.Effective C++中文版:
http://dlb.pchome.net/development/reference/effectiveCplus.zip

24.More Effective C++中文版-zhc译
http://cable.pchome.net/development/reference/MEC0410.zip

25.More Effective C++中文版-候捷译
http://www.nethovel.com/resources/MoreEffectiveC++(WQ).zip

26.Essential C++中文版(全)-候捷译
http://www.nethovel.com/resources/Essential%20C++中文版(全).rar

27.Programming Windows程式开发设计指南-Petzoldi著 余孟学 译
中文版:http://www.nethovel.com/resources/ProgrammingWindows_tw.chm
英文版:http://www.nethovel.com/resources/Petzoldi.chm

28.WinAsm32汇编教程- Iczelion
http://www.nethovel.com/resources/winasm.chm

29.Windows 95 程序设计指南-候捷译
http://www.nethovel.com/resources/win95adg.zip

30.Thinking in C++ 2nd Edition(C++编程思想)
英文版:http://www.nethovel.com/resources/ThinkinginC++.zip
中文版:http://www.dingbing.com/book/thinkc.zip

31.人月神话-中文版
http://www.goodassister.com/book/rysh.pdf

32.The C++ Programming Language英文
http://computerstep.w18.net/C/The%20C++%20Programming%20Language.rar

33.VC技术内幕第五版 http://www.helpwork.com/downdata/book/programming/vc/book/vc++2/invcpp5.chm

34.com技术内幕
http://www.helpwork.com/book/html/user/download.asp?id=1123

35.com+技术内幕
http://www.helpwork.com/book/html/user/download.asp?id=952

36.新编 Windows API参考大全
http://www.4046.com/nnsrc/down/WindowsAPIdq.rar

37.The C programming Language // By Brian W. Kernighan and Dennis M. Ritchie
下载地址:http://www.jka77.com/book/The_C_programmin.chm

38.C语言编程手册
下载地址:http://www.jka77.com/book/CL.chm

39.Delphi 7高效数据库程序设计
By 李维
下载地址:http://www.codestudy.net/book/download.asp?id=1163&sort=5

40.Windows网络编程(第2版)
By Anthony Jones,Jim Ohlund 清华大学出版社
下载地址:英文版:http://www.guxiang.com/epubcn/readings/diannaotushu/500/download/1107/network_prog_for_win_2nd.zip

41.Windows2000编程技术内幕
By Mickey Williams 机械工业出版社
下载地址:ftp://ftp.frontfree.net/Pub/Books/C&C++/VC/Windows2000编程技术内幕.rar

42.数据仓库
By W.H.Inmon 清华大学出版社
下载地址1:http://tips.9hao.com/vvbksd/20011120/数据仓库.zip
下载地址2: ftp://ftp.math.nankai.edu.cn/Ebook/China-pub/chinapub_computerscience_multimedia/ComputerScience/%CA%FD%BE%DD%B2%D6%BF%E2/

43.编码的奥秘
By Charles Petzold 机械工业出版社
下载地址:ftp: //ftp.math.nankai.edu.cn/Ebook/China-pub/chinapub_computerscience_multimedia/ComputerScience/%B1%E0%C2%EB%B5%C4%B0%C2%C3%D8/

44.编译原理及实践
By Louden, K.C 机械工业出版社
下载地址: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/

45.Inside C++ Object Model(深度探索C++对象模型)
By Lippman 候捷译
下载地址:http://www.jka77.com/book/inside-the-cpp-object-model.pdf

46.C++标准程序库
By Josuttis
下载地址1:http://www.codestudy.net/book/download.asp?id=1205&sort=5
下载地址2: ftp://ftp.math.nankai.edu.cn/Ebook/C_C++/The Cpp Standard Library.pdf

47.STL源码剖析
By 候捷
下载地址:ftp://ftp.math.nankai.edu.cn/Ebook/C_C++/STL源码剖析–侯捷.pdf

48.C++批判(第三版) -看看C++的坏话!
By I don’t know
下载地址:http://www.jka77.com/book/CPPPP.pdf

49.程序设计实践
下载地址:ftp://ftp.math.nankai.edu.cn/Ebook/China-pub/chinapub_computerscience_multimedia/%B3%CC%D0%F2%C9%E8%BC%C6%CA%B5%BC%F9/

50.c++沉思录
By Andrew Koenig Barbara Moo 人民邮电出版社
下载地址:http://www.codestudy.net/book/download.asp?id=1261&sort=5

51.C++Builder4技术内幕 (这本书俺不知道好不好)
By I don’t Know
下载地址:http://www.codestudy.net/book/download.asp?id=1254&sort=5

52.下面两本书一般大家硬盘里都有的吧,而且很老了,但是为了全面,就提上来吧
(1)Windows 95 程式设计指南 – 候捷
下载地址:http://jjhou.csdn.net/win95-a-developers-guide.pdf
(2)Windows 95 系统程式设计大奥秘 – 候捷
下载地址:http://jjhou.csdn.net/windows95-system-programming-secrets.pdf

53. 中国大百科全书·数学
下载地址:ftp://ftp.math.nankai.edu.cn/Ebook/中国大百科全书/中国大百科全书·数学.pdf

54、4.0M Bjarne Stroustrup – The C++ Programming Language
http://www.u-n-f.com/books/archive/The%20C++%20Programming%20Language.tar.gz

55、1.0M Richard Stevens – TCP-IP Illustrated
http://www.u-n-f.com/books/archive/TCP-IP%20Illustrated.tar.gz

56、4.5M Randall Hyde – Art Of Assembly
http://www.u-n-f.com/books/archive/Randall%20Hyde%20-%20Art%20Of%20Assembly.tar.gz

57、2.1M M. Abrash – Zen of Graphics Programming
http://www.u-n-f.com/books/archive/M.%20Abrash%20-%20Zen%20of%20Graphics%20Programming.zip

58、249k Kernighan and Ritche – The C Programming Language
http://www.u-n-f.com/books/archive/Kernighan%20and%20Ritchie%20-%20The%20C%20Programming%20Language.zip

59、3.3M Bruce Schneier – Applied Cryptography
http://www.u-n-f.com/books/archive/Bruce%20Schneier%20-%20Applied%20Cryptography.zip

60、PHP4_Grundlagen_und_Profiwissen
http://www.u-n-f.com/books/archive/lamp/PHP4_Grundlagen_und_Profiwissen.pdf

61.《C++ Builder高级编程技术》
http://www.dingbing.com/book/builder.zip

62.《VC++ 6.0 TLR 模板库参考手册》
http://www.easysea.com/diannao/download/prog/c/mbkc.zip

63.《BORLAND C++ BUILDER 实用培训教程》
http://202.101.232.120/book/openfile.asp?id=223&filename=BC98_CB526.zip

64.《Delphi高级开发指南》
http://www.pcbookcn.com/s10899book/program/delphi/Delphi_gjkfzn_for3.rar

65.《新编 Windows API参考大全》
ftp://book:book@down.pcbookcn.com/pro/delphi/新编Windows_API_参考大全.rar

66.《Delphi深度历险-附书源码》
http://www.pcbookcn.com/s10899book/program/delphi/Delphi_sdlx_code.rar

67.《Delphi 7高效数据库程序设计》
ftp://book:book@down.pcbookcn.com/pro/delphi/李维的新书《Delphi7高效数据库程序设计》.rar

68.《Delphi7开发指南》
ftp://book:book@down.pcbookcn.com/pro/delphi/delphi7开发指南.rar

69.《Delphi6集成开发环境》
ftp://book:book@down.pcbookcn.com/pro/delphi/Delphi6集成开发环境.rar

70.《Delphi6数据库编程》
ftp://book:book@down.pcbookcn.com/pro/delphi/Delphi6数据库编程.rar

72.《Delphi5.xADO_MTS_COM+高级程序设计篇》
ftp://book:book@down.pcbookcn.com/pro/delphi/Delphi5.xADO_MTS_COM+高级程序设计篇.rar

73.《VISUAL BASIC 编程标准》
http://www.dingbing.com/book/vb.zip

74.《Visual Basic6.0中文版程序员指南》
http://www.easysea.com/diannao/download/prog/vb/zwbc.zip

75.《Visual Basic 6.0 控件参考手册》
http://www.easysea.com/diannao/download/prog/vb/kjck.zip

76.《Visual Basic 6.0中文版语言参考手册》
http://www.easysea.com/diannao/download/prog/vb/zwby.zip

77.《Visual Basic 6.0 开发宝典》
http://www.easysea.com/diannao/download/prog/vb/kfbd.zip

78.《Visual Basic 6.0 实例教程》
http://www.easysea.com/diannao/download/prog/vb/sljc.zip

79.《VB 6.0 中文版实用参考手册》
http://www.easysea.com/diannao/download/prog/vb/syck.zip

80.《Visual Basic 6开发人员指南》
http://www.easysea.com/diannao/download/prog/vb/kfzn.zip

81.《VB 和 SQL Server 编程指南(第五版)》
http://www.easysea.com/diannao/download/prog/vb/bczn.zip

82.《Jbuilder 5 中文帮助》
http://www.pdown.net/download.asp?downid=2&id=991

83.《JBuilder开发人员指南》
http://youth.dlmu.edu.cn/book/list_down.php?bkid=224

84.《Win32的Internet函数说明》
档案大小: 245248K
http://www.easysea.com/diannao/download/prog/windows/win32int.zip

85.《Visual InterDev 从入门到精通》
http://www.easysea.com/diannao/download/prog/interdev/crmd.wdl

86.《Visual InterDev 6.0 Web 参考手册 》
http://www.easysea.com/diannao/download/prog/interdev/jsck.zip

87.《Visual InterDev 6.0 Guide 程序员》
http://www.easysea.com/diannao/download/prog/interdev/cxyz.zip

88.《JavaScript 程序开发手册》
http://www.cty99.com/Templet/bookdownmore.asp?booktype=script#

89.《JAVA 大全》
http://www.easysea.com/diannao/download/prog/java/cxkf.zip

90.《Visual J++ 6.0 WFC 类库参考手册》
http://www.easysea.com/diannao/download/prog/java/lkck.zip

91.《Java联想(中文)》
http://www.easysea.com/diannao/download/prog/java/lkck.zip

92.《Oracle 8 实用大全》
http://www.easysea.com/diannao/download/prog/oracle/sydq.zip

93.《Microsoft SQL Server 管理员手册》
http://www.easysea.com/diannao/download/prog/sql/glys.zip

94.《掌握ACCESS开发》
http://www.easysea.com/diannao/download/prog/sql/glys.zip

95.《Oracle Performance Tuning and Optimization》
http://www.oradb.net/book/oracle_pt.zip

96.《Oracle ProC 程序设计》
http://www.oradb.net/book/oracleproc.zip

97.《Oracle8初学者指南》
http://www.easysea.com/diannao/download/prog/oracle/cxzz.zip

98.《RED HAT LINUX 6大全》
http://www.dingbing.com/book/redhatall.zip

99.《RED HAT LINUX 6管理工具》
http://www.dingbing.com/book/redhatman.zip

100.《VC++高级编程》
http://www.easysea.com/diannao/download/prog/c/vcgj.zip
QQ群:12418867

Read: 821

C中const的使用

基本解释

  const是一个C语言的关键字,它限定一个变量不允许被改变。使用const在一定程度上可以提高程序的健壮性,另外,在观看别人代码的时候,清晰理解const所起的作用,对理解对方的程序也有一些帮助。
虽然这听起来很简单,但实际上,const的使用也是c语言中一个比较微妙的地方,微妙在何处呢?请看下面几个问题。

问题:const变量 & 常量

为什么我象下面的例子一样用一个const变量来初始化数组,ANSI C的编译器会报告一个错误呢?

const int n = 5;
int a[n];

答案与分析:

1)、这个问题讨论的是“常量”与“只读变量”的区别。常量肯定是只读的,例如5, “abc”,等,肯定是只读的,因为程序中根本没有地方存放它的值,当然也就不能够去修改它。而“只读变量”则是在内存中开辟一个地方来存放它的值,只不过这个值由编译器限定不允许被修改。C语言关键字const就是用来限定一个变量不允许被改变的修饰符(Qualifier)。上述代码中变量n被修饰为只读变量,可惜再怎么修饰也不是常量。而ANSI C规定数组定义时维度必须是“常量”,“只读变量”也是不可以的。

2)、注意:在ANSI C中,这种写法是错误的,因为数组的大小应该是个常量,而const int n,n只是一个变量(常量 != 不可变的变量,但在标准C++中,这样定义的是一个常量,这种写法是对的),实际上,根据编译过程及内存分配来看,这种用法本来就应该是合理的,只是ANSI C对数组的规定限制了它。

3)、那么,在ANSI C 语言中用什么来定义常量呢?答案是enum类型和#define宏,这两个都可以用来定义常量。

问题:const变量 & const 限定的内容

  下面的代码编译器会报一个错误,请问,哪一个语句是错误的呢?

typedef char * pStr;
char string[4] = "abc";
const char *p1 = string;
const pStr p2 = string;
p1++;
p2++;

答案与分析:

问题出在p2++上。

1)、const使用的基本形式: const char m;

限定m不可变。

2)、替换1式中的m, const char *pm;

限定*pm不可变,当然pm是可变的,因此问题中p1++是对的。

3)、替换1式char, const newType m;

限定m不可变,问题中的charptr就是一种新类型,因此问题中p2不可变,p2++是错误的。

问题:const变量 & 字符串常量

请问下面的代码有什么问题?

char *p = "i’m hungry!";
p[0]= ‘I’;

答案与分析

上面的代码可能会造成内存的非法写操作。分析如下, “i’m hungry”实质上是字符串常量,而常量往往被编译器放在只读的内存区,不可写。p初始指向这个只读的内存区,而p[0] = ‘I’则企图去写这个地方,编译器当然不会答应。

问题:const变量 & 字符串常量2

请问char a[3] = "abc" 合法吗?使用它有什么隐患?

答案与分析

在标准C中这是合法的,但是它的生存环境非常狭小;它定义一个大小为3的数组,初始化为“abc”,,注意,它没有通常的字符串终止符”,因此这个数组只是看起来像C语言中的字符串,实质上却不是,因此所有对字符串进行处理的函数,比如strcpy、printf等,都不能够被使用在这个假字符串上。

问题5:const & 指针

类型声明中const用来修饰一个常量,有如下两种写法,那么,请问,下面分别用const限定不可变的内容是什么?

1)、const在前面

const int nValue; //nValue是const
const char *pContent; //*pContent是const, pContent可变
const (char *) pContent;//pContent是const,*pContent可变
char* const pContent; //pContent是const,*pContent可变
const char* const pContent; //pContent和*pContent都是const

2)、const在后面,与上面的声明对等

int const nValue; // nValue是const
char const * pContent;// *pContent是const, pContent可变
(char *) const pContent;//pContent是const,*pContent可变
char* const pContent;// pContent是const,*pContent可变
char const* const pContent;// pContent和*pContent都是const

答案与分析:

const和指针一起使用是C语言中一个很常见的困惑之处,在实际开发中,特别是在看别人代码的时候,常常会因为这样而不好判断作者的意图,下面讲一下我的判断原则:

沿着*号划一条线,如果const位于*的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;如果const位于*的右侧,const就是修饰指针本身,即指针本身是常量。你可以根据这个规则来看上面声明的实际意义,相信定会一目了然。

另外,需要注意:对于const (char *) ; 因为char *是一个整体,相当于一个类型(如 char),因此,这是限定指针是const。

另=======

const用于函数时出现三个位置:
例如:
const returnVal   function (const list_array)const;

形式不过如此
第一个const意思是:返回值是常量
第二个const意思是:函数过程中不能修改list_array的值
第三个const意思是:函数过程不能隐式的修改function参数的值

===

const char*, char const*, char*const的区别问题几乎是C++面试中每次都会有的题目。
事实上这个概念谁都有只是三种声明方式非常相似很容易记混。
Bjarne在他的The C++ Programming Language里面给出过一个助记的方法:
把一个声明从右向左读。
char * const cp; ( * 读成 pointer to )
cp is a const pointer to char
const char * p;
p is a pointer to const char;
char const * p;
同上因为C++里面没有const*的运算符,所以const只能属于前面的类型。

另:面定义的一个指向字符串的常量指针:
char * const prt1 = stringprt1;
其中,ptr1是一个常量指针。因此,下面赋值是非法的。
ptr1 = stringprt2;
而下面的赋值是合法的:
*ptr1 = "m";
因为指针ptr1所指向的变量是可以更新的,不可更新的是常量指针ptr1所指的方向(别的字符串)。
下面定义了一个指向字符串常量的指针:
const * ptr2 = stringprt1;
其中,ptr2是一个指向字符串常量的指针。ptr2所指向的字符串不能更新的,而ptr2是可以更新的。因此,
*ptr2 = "x";
是非法的,而:
ptr2 = stringptr2;
是合法的。
所以,在使用const修饰指针时,应该注意const的位置。定义一个指向字符串的指针常量和定义一个指向字符串常量的指针时,const修饰符的位置不同,前者const放在*和指针名之间,后者const放在类型说明符前。

Read: 725

[转]TCP/IP 网络基础(v 0.2b)

作者:北南南北
来自:LinuxSir.Org
赞助: pandonny、etony、Linuxfish ……..
简介:本文简要的讲了讲TCP/IP的一点基础,包括TCP/IP网络模型;网络分类及切割,以及服务和端口等基础知识;需要声明的是,我并不懂TCP/IP的原理,我只是写一点比较表面的东西。

此文正在修正中,希望高手指点和补充。谢谢~


目录



++++++++++++++++++++++++++++++++++++++++++++++++++++
正文
++++++++++++++++++++++++++++++++++++++++++++++++++++


1、TCP/IP 概述;

TCP/IP 实际上并不是一个协议,而是一组协议,它包括IP、TCP、UDP、ICMP、ARP等;


1.1 什么是IP、ARP、ICMP、UDP;

IP (Internet Protocol),网际协议;IP是TCP/IP 的最底层,高层协议都要转化为IP包,IP包含了源地址和目的地址,路由决策也发生在IP层;

ARP (Address Resolution Protocol) ,地址解析协方,把IP地址转换为硬件物理地址,比如我们所用的网卡的物理地址,类似aa:bb:cc:dd:ee:ff。

ARP Short for Address Resolution Protocol, a network layer protocol used to convert an IP address into a physical address (called a DLC address), such as an Ethernet address. A host wishing to obtain a physical address broadcasts an ARP request onto the TCP/IP network. The host on the network that has the IP address in the request then replies with its physical hardware address.

There is also Reverse ARP (RARP) which can be used by a host to discover its IP address. In this case, the host broadcasts its physical address and a RARP server replies with the host’s IP address.

ICMP (Internet Control Message Protocol),网际报文协议;它包括了数据包的错误、控制等相关信息。比如ping 命令就是利用ICMP来测试一个网络的连接情况的工具;

Short for Internet Control Message Protocol, an extension to the Internet Protocol (IP) defined by RFC 792. ICMP supports packets containing error, control, and informational messages. The PING command, for example, uses ICMP to test an Internet connection

TCP (Transmission Control Protocol),传输控制协议。TCP运行在IP之上,是基于数据流连接和面向的协议,应用程序把数据要经过TCP/IP的分割成若干包,这样数据就以字节流发送和接收,到达目的地后,TCP/IP 再按顺序进行组装。TCP/IP 要保证机器与机器之间的连接的可靠性,还要有纠错。TCP是否被选择,取决于应用程序或服务;

TCP is one of the main protocols in TCP/IP networks. Whereas the IP protocol deals only with packets, TCP enables two hosts to establish a connection and exchange streams of data. TCP guarantees delivery of data and also guarantees that packets will be delivered in the same order in which they were sent.

UDP (User Datagram Protocol) ,用户数据报协议 ,象TCP一样运行在IP之上,是基于数据报或分组的协议,UDP/IP 可以直接发送和接收数据报文,而不必做验证,这一点与TCP/IP 不同。TCP是否被选择,取决于应用程序或服务;

Abbreviated UDP, a connectionless protocol that, like TCP, runs on top of IP networks. Unlike TCP/IP, UDP/IP provides very few error recovery services, offering instead a direct way to send and receive datagrams over an IP network. It’s used primarily for broadcasting messages over a network.


1.2 TCP/IP 网络模型;

TCP/IP 的网络模型是如图所示;


2、IP地址、网络类型、网络切割;

TCP/IP 网络的每台计算机都至少有一个(一个计算机有多个网卡是存在的)合法的IP地址,IP地址把此计算机和网络的其它计算机区别开来。由于IP地址分为两部份,一部份代表网络,另一部份代表主机。如果想把一个网络和另一个网络区分开来,就涉及到网络切割。


2.1 IP 地址概说;

IP地址是标识主机在网络中的位置,象是一个门牌号一样。所有IP都经过 Internet Assigned Numbers Authority (IANA)分配。IP地址是由四个字节组成,格式 为A:B:C:D,比如 192.168.1.1 。LinuxSir.Org 的IP是多少?ping LinuxSir.Org 就知道了。

IP都经过 Internet Assigned Numbers Authority (IANA)分配。一般的情况下,IANA只和各国政府机构、学会、ISP、或IDC公司交涉。咱们用的IP地址,都是IDC或ISP提供的。比如 LinuxSir.Org 的地址是由网通提供的。我用的ADSL,是铁通提供的。

IP 地址是由四个字节组成,格式 A.B.C.D,每个字节又是由8位二进制数字组成,也就是这样的格式 xxxxxxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx 。在A:B:C:D中,前1到3位,可以用来识别网络,其余部份就用来表示网络上的主机。

         A       .          B       .        C        .       D   
xxxxxxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx

地址中哪几位用来识别网络,哪几位用来识别主机,是通过网络掩码来实现的。网络掩码也是一个四字节的数,如果换算成二进制的数字,对应网络部份为1,而主机部份为0。

比如掩码为 255.255.255.0 ,换算成二进制就是 11111111.11111111.11111111.11111111.00000000 。

      A .        B .  C  . D
255 . 255 . 255 . 0
11111111.11111111.11111111.00000000
|-----网络部份----|主机部份|

这表示的意思是网络中的所有主机的IP地址的前三位必须是相同的,也就是A.B.C是相同的,最后一位是主机位,主机位的不同,就把网络中的计算机区分开来。比如 192.168.1.1 和192.168.1.2 是不同的主机。

在 255.255.255.0 这个网络中,从理论上来说,应该有256台主机,但事实上却不是这样。

网络地址和广播地址:

每个网络都有一个网络地址和广播地址,网络地址是把此网区别于彼网的标识,主机部份为0,(二进制),而广播地址的主机部份全为1。

比如192.168.1.0/24的网络。按理论来说,IP地址应该从192.168.1.0到192.168.1.255 ,网络最多有主机数应该有256台,但因为网络地址占用了192.168.1.0,广播地址占用了 192.168.1.255 ,所以在192.168.1.0/24的网络中,最多只能容纳254台机器。

Address:   192.168.1.0           11000000.10101000.00000001 .00000000
Netmask: 255.255.255.0 = 24 11111111.11111111.11111111 .00000000
Wildcard: 0.0.0.255 00000000.00000000.00000000 .11111111
=>
Network: 192.168.1.0/24 11000000.10101000.00000001 .00000000 (Class C)
Broadcast: 192.168.1.255 11000000.10101000.00000001 .11111111
HostMin: 192.168.1.1 11000000.10101000.00000001 .00000001
HostMax: 192.168.1.254 11000000.10101000.00000001 .11111110
Hosts/Net: 254 (Private Internet RFC 1918)


2.2 网络分类;

IANA把网络进行分类,分类如下:


2.21 A类网络:

A类网络部份为8位(二进制),主机部份为24位(二进制)。

         A       .           B     .             C    .     D
xxxxxxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx
|>网络部份<|---->主机部份<--------------|

地址的第一个字节,范围从1到127 ;比如 IP地址 126.1.12.0 就归属于A类网络的地址。


2.22 B类网络:

B类网络部份为16位(二进制),主机部份为16位(二进制)。

         A       .         B        .        C        .   D    
xxxxxxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx
|---->网络部份<-----|-----主机部份<-----|

地址的第一个字节,范围是128-191 ;比如 IP地址 129.13.1.0 就归属于B类网络。


2.23 C类网络:

C类网络部份为24位(二进制),主机部份为8位(二进制)。

         A       .         B        .        C        .   D    
xxxxxxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx
|----------网络部份---------| -主机部份 -|

地址的第一个字节,范围是192-223;比如 IP地址193.1.21.0 就归属于C类网络。


为了简单一点,我们用表格列出:

IP地址的第一个字节       归属网络

1-127 A类
128-191 B类
192-223 C类


2.24 保留地址;

为了保证一些网络能有永远不能接上Internet 上(或通过NAT才能接到Internet),这些地址用于私有网络,比如我们所用的本地网地址 192.168.1.0/24网络就是。下面的一些网络地址是私有的,只能通过NAT转换为公网地址才能访问Internet 。

地址范围              网络类

10.0.0.0-10.255.255.255 A类
172.16.0.0-172.31.255.255 B类
192.168.0.0-192.168.255.255 C类
127.0.0.1-127.255.255.255 回环地址

其中回地址表示数据包的发送和接收都在同一台主机,如果想让一个程序只能在本机上运行,就用这个地址。回环地址一般是用127.0.0.1 。在Linux中,用ifconfig lo就能看到了。


2.3 网络切割;

大型网络可以划分为几个小的网络,这些小的网络被称为子网。划分大型网络地址块为一些小的子网,可以从主机部份进行切分,这样就能形成一个一个的子网。子网掩码可以用来构建超网,例如:192.168.1.2 掩码: 255.255.254.0,也可写成192.168.0.0/23,23代表子网掩码中连续“1”的个数。还可以进行子网划分,例如: 192.168.1.130 掩码: 255.255.255.240,也可写成192.168.1.130/28网络,即:网络ID为192.168.1.128,主机ID为2。

切割网络还要知道十进制到二进制的相互换算,这是比较麻烦的。用笔来算是有点难为人。不过我们可以用一个脚本工具来算。

网络切割脚本下载 ,请点击: 网络切割计算器

下载后要解压;

#tar zxvf ipcalclinuxsir.pl.tar.gz
# chmod 755 ipcalc.pl
# ./ipcalc.pl

可以指定单个IP和掩码来判断网络,比如:

[root@localhost ~]# ./ipcalc.pl 192.168.1.4/255.255.255.0

Address: 192.168.1.4 11000000.10101000.00000001 .00000100
Netmask: 255.255.255.0 = 24 11111111.11111111.11111111 .00000000
Wildcard: 0.0.0.255 00000000.00000000.00000000 .11111111
=>
Network: 192.168.1.0/24 11000000.10101000.00000001 .00000000 (Class C)
Broadcast: 192.168.1.255 11000000.10101000.00000001 .11111111
HostMin: 192.168.1.1 11000000.10101000.00000001 .00000001
HostMax: 192.168.1.254 11000000.10101000.00000001 .11111110
Hosts/Net: 254 (Private Internet RFC 1918)

值得注意的是:同一个IP地址,由于掩码不同,此IP地址可能属于不同的网络。所以掩码的设置对于主机来说十分重要。

IP地址:192.168.1.2 掩码: 255.255.254.0,属于192.168.0.0/23网络;

Address:   192.168.1.2           11000000.10101000.0000000 1.00000010
Netmask: 255.255.254.0 = 23 11111111.11111111.1111111 0.00000000
Wildcard: 0.0.1.255 00000000.00000000.0000000 1.11111111
=>
Network: 192.168.0.0/23 11000000.10101000.0000000 0.00000000 (Class C)
Broadcast: 192.168.1.255 11000000.10101000.0000000 1.11111111
HostMin: 192.168.0.1 11000000.10101000.0000000 0.00000001
HostMax: 192.168.1.254 11000000.10101000.0000000 1.11111110
Hosts/Net: 510 (Private Internet RFC 1918)

IP地址:192.168.1.2 掩码: 255.255.255.0,属于192.168.1.0/24网络;

Address:   192.168.1.2           11000000.10101000.00000001 .00000010
Netmask: 255.255.255.0 = 24 11111111.11111111.11111111 .00000000
Wildcard: 0.0.0.255 00000000.00000000.00000000 .11111111
=>
Network: 192.168.1.0/24 11000000.10101000.00000001 .00000000 (Class C)
Broadcast: 192.168.1.255 11000000.10101000.00000001 .11111111
HostMin: 192.168.1.1 11000000.10101000.00000001 .00000001
HostMax: 192.168.1.254 11000000.10101000.00000001 .11111110
Hosts/Net: 254 (Private Internet RFC 1918)


3、 路由和网关;

3.1 路由,此网和彼网沟通的纽带;

在同一个网段之间(网络ID相同),主机可以互相通讯,比如同一网段的主机相互沟通不需要路由,比如 192.168.1.2和192.168.1.3之间的沟通就不需要路由。如果两个不同的网络(网络ID不同)需要通讯,比如 192.168.1.0/24网络的主机和192.168.2.0/24内的主机相互沟通,那么需要路由器(或者网关)来指明数据包的“传输路径”来实现这一目的。

常用的做法是用一台多穴主机来作网关(多个网络接口,分别连着外网与内网),使得内网计算机通过网关访问Internet。在linux里面一般用 iptables做NAT(网络地址转换)来实现网关功能,如果充当网关的机器有一个固定IP,我们可以使用SNAT(源网络地址转换);如果充当网关的机器是拨号上网,也就是IP不固定,那么一般我们用MASQUERADE,它可以动态的识别网关的地址。当然,固定ip也是可以用MASQUERADE 的,但是系统资源要耗费大一些。

比如LinuxSir.Org 服务器托管在IDC机房中,机房要为我们提供IP地址、掩码、网关。

在Linux 中,查看本地机的路由是通过route命令来实现的,比如:

[root@localhost ~]# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.1.0 * 255.255.255.0 U 0 0 0 eth0
169.254.0.0 * 255.255.0.0 U 0 0 0 eth0
default 192.168.1.1 0.0.0.0 UG 0 0 0 eth0

此主机的默认路由就是192.168.1.1 ,至于更多的配置路由的细节,我们将在以后的章节加以讨论。

网关;


4 、服务和端口;

在一台计算机运行的操作系统,如果这台计算机是连接在网络中的,它一定得有一个IP地址。在网络上使用 ip 来标示一个点,也可以理解为标示一台主机。如果您的计算机分配了两个ip 比如你启用了两块网卡,在网络上就认为这是不同的两个主机。在这台计算机上可能运行着很多的服务。

端口则是用来标示特定主机的特定服务,比如linuxsir的 www 服务要用 ip:80 来标示。

比如 LinuxSir.Org 的服务器上有FTP、SSH、WWW、IRC等服务,这些服务都用的是一个IP地址。为了能把这些服务运行起来,我们指定了WWW服务器用的是80端口。FTP服务器用的是 21端口等。这块好象不难理解。

查看Linux服务和端口的字典文件位于 /etc/services ,它 是一个字典文件, 并不用来分配端口。其内容有如下类似的:

ftp 20/tcp 注:传输命令
ftp 21/tcp 注:传输数据
ssh 22/tcp
telnet 23/tcp

有些服务一般是采用默认端口,比如 ftp服务器默认端口是21,ssh服务器端认端口是22,telnet默认端口是23 。当然您可以改变服务的默认端口,以增强系统的安全性;我们在以后的教程中,会涉及到此方面的内容。


5、套接字接口;

套接字接口是进程之间相互通信的网络连接接口。


6、关于本文;

这一节主要讲的是TCP/IP的基础知识,我写这些内容实在是眼高手低。在写的过程中向Pandonny、etoy 、Linuxfish等弟兄请教,才勉强把初稿写出来。至于是不是对的,我不敢说,还是请高手指点吧。有的地方的确需要补充,但又不知道如何下手。

本来五十米的竞赛中,我最快能跑到6.7秒,但现在要求自己跑到6秒,实在是超出我的能力。所以这也是最痛苦的一篇文档。再一次请教求高手指教。

如果说哪有现成的文档,就近抄来,我看没有必要了。现成的文档是多,但做为这个系列文档,我还是希望能出在LinuxSir.Org 上,用最简单的话把比较深奥的理念条理化、清晰化。对于一般用户来说,只要了解一点基础就够了,没有必要知道TCP/IP的所有东西。

还是那句话,学为所用,用为所学。洋为中用,旧文今用,但得更造一下。

谢谢;


7、致谢;

本文得到了pandonny、etoy、Linuxfish 等三位弟兄的帮助,在此致谢;

Read: 670

关于meta标签的使用

meta是用来在HTML文档中模拟HTTP协议的响应头报文。meta 标签用于网页的<head>与</head>中, meta 标签的用处很多。meta 的属性有两种:name和http-equiv。name属性主要用于描述网页,对应于content(网页内容),以便于搜索引擎机器人查找、分类(目前几乎所有的搜索引擎都使用网上机器人自动查找meta值来给网页分类)。这其中最重要的是 description(站点在搜索引擎上的描述)和keywords(分类关键词),所以应该给每页加一个meta值。比较常用的有以下几个:

name 属性

1、<meta name="Generator" contect="">用以说明生成工具(如Microsoft FrontPage 4.0)等;

2、<meta name="KEYWords" contect="">向搜索引擎说明你的网页的关键词;

3、<meta name="DEscription" contect="">告诉搜索引擎你的站点的主要内容;

4、<meta name="Author" contect="你的姓名">告诉搜索引擎你的站点的制作的作者;

5、<meta name="Robots" contect= "all|none|index|noindex|follow|nofollow">

其中的属性说明如下:

设定为all:文件将被检索,且页面上的链接可以被查询;

设定为none:文件将不被检索,且页面上的链接不可以被查询;

设定为index:文件将被检索;

设定为follow:页面上的链接可以被查询;

设定为noindex:文件将不被检索,但页面上的链接可以被查询;

设定为nofollow:文件将不被检索,页面上的链接可以被查询。

http-equiv属性

1、<meta http-equiv="Content-Type" contect="text/html";charset=gb_2312-80">

和 <meta http-equiv="Content-Language" contect="zh-CN">用以说明主页制作所使用的文字以及语言;

又如英文是ISO-8859-1字符集,还有BIG5、utf-8、shift-Jis、Euc、Koi8-2等字符集;

2、<meta http-equiv="Refresh" contect="n;url=http://yourlink">定时让网页在指定的时间n内,跳转到页面http://yourlink;

3、<meta http-equiv="Expires" contect="Mon,12 May 2001 00:20:00 GMT">可以用于设定网页的到期时间,一旦过期则必须到服务器上重新调用。需要注意的是必须使用GMT时间格式;

4、<meta http-equiv="Pragma" contect="no-cache">是用于设定禁止浏览器从本地机的缓存中调阅页面内容,设定后一旦离开网页就无法从Cache中再调出;

5、<meta http-equiv="set-cookie" contect="Mon,12 May 2001 00:20:00 GMT">cookie设定,如果网页过期,存盘的cookie将被删除。需要注意的也是必须使用GMT时间格式;

6、<meta http-equiv="Pics-label" contect="">网页等级评定,在IE的internet选项中有一项内容设置,可以防止浏览一些受限制的网站,而网站的限制级别就是通过meta属性来设置的;

7、<meta http-equiv="windows-Target" contect="_top">强制页面在当前窗口中以独立页面显示,可以防止自己的网页被别人当作一个frame页调用;

8、<meta http-equiv="Page-Enter" contect="revealTrans(duration=10,transtion= 50)">和<meta http-equiv="Page-Exit" contect="revealTrans(duration=20,transtion=6)">设定进入和离开页面时的特殊效果,这个功能即 FrontPage中的“格式/网页过渡”,不过所加的页面不能够是一个frame页面。

以上是常用的几个meta属性,有个人主页的朋友不妨在你的主页中加上它,效果可是不一样的哦:)。

Read: 590