none
WIN下编程,是否该在纯C语言学习牵扯太久 RRS feed

答案

  • 编程语言是个信仰问题…… C和C++还是两大阵营,更别说C和Java了。其实哪门学通了都可以,只要不要浅尝则止。不建议你学MFC,封装的太落后了,太难用了,说实话是该淘汰了。要是只做界面的话,找本Qt教学的书,比MFC强太多了。要是需要学习多线程这些和系统相关比较紧的东西,那就直接看Win32 SDK中的API就行了。
    0xBAADF00D
    2010年8月23日 7:45
    版主

全部回复

  • 在网上查到两篇文章:

    其一:http://bbs.51cto.com/thread-145586-1.html

    C语言已经死了,我们需要忘却它,不要在它上面浪费时间

    每个程序员都应该学习C语言?我可不这么认为 这篇文章看起来像是12年前写的。 3 K8 Z% v3 j8 s* y" y8 G$ p& x7 V8 X
    : O! ^% ~3 p! t2 Q5 |+ f$ h
    有人说,“每个”程序员都应该学习C语言,这太滑稽了。在2006年,我甚至想不到那怕一个让“每一个”程序员都学习C语言的原因。事实上,我能想到的需要用到C语言的地方,仅仅是在编写设备驱动程序的时候。我认识大约200个程序员。其中有多少个是编写驱动程序的呢?一个都没有!% x. w2 [: v! H2 G1 r% P
    9 `' q# g, u+ g4 Z3 f# }7 ?
    今天,连微控制器这种东西都嵌入到了JAVA虚拟机中了。
    一个计算器参数,比如说JAVA虚拟机,数据库,操作系统是用C语言写的。这是事实,但是实际上有多少人在写这些东西?在所有程序员里面恐怕只占5-10%。/ _0 ?0 v3 k. T7 ?0 V
    # D8 f, R5 m! b2 Z" f- l; r
    噢,等等。忘了游戏。但游戏也大部分是由C++写的。尽管比较C和C++就像比较C#和C,有一些人还是会争论说那是用C写的。确实,“看”上去他们可能一样,但事实上他们的区别就像是大宇和法拉利的区别。4 s- M2 E' s0 S1 {- V  N/ |! y
    5 y7 `; M; d1 j( k
    下面,我对那篇文章逐条列出我的反驳意见:6 k; K) V' \1 [8 R8 H
    1)相比较其他的编程语言(像C++,JAVA),C语言是个低级语言。从总体上来说,低级的编程语言可以让你更好的了解计算机。+ e
    '
    确实在C语言中你不得不进行分配/释放内存的工作,但除了C语言有指针(C++也有指针)和C语言的字符串处理有点难看之外,C语言真的和其他高级语言没什么不同。

    2)设备驱动程序和操作系统只能用C语言来编写。现在,你可能还从来没有编写过一个设备驱动程序或者一个操作系统,但是如果你需要去修改他们的时候,怎么办?
    O6 O  E
    这完全是错误的。设备驱动程序现在已经用C++写了(C++离C比C++离C#还要远)。而操作系统(单一的)的内核,操作系统和设备驱动程序都是用C#写的。但我还是不得不承认确实有一部分是用C语言写的。2 D+ I7 I/ {; @# V. d+ E7 V1 T% ~

    3)如果你想要得到一份编写微控制器程序的工作的时候,该怎么办?他们都是用C语言编写的。就因为不想学习一门新的语言,你就准备限制你能得到工作的机会吗?5 y/ R& T1 v$ A4 o

    再说一次,很多很多微控制器是基于JAVA的,所以这个观点是站不住脚的。这个观点的另一部分更是毫无意义的。因为你懂C语言,并不代表你懂微处理器的每个方面。就像,我不知道怎么开飞机,那就限制了我可能得到工作的机会了吗?4 c8 ]) I) u3 i$ z5 A9 _. b$ {6 h' S

    4) C的程序比其他用别的语言写的程序,实现相同的功能,它用的代码行数更少,而它带来的运行效率却更快。有时候,你的程序所需要的速度,只有C语言能做到。( |) w: W" y3 a" k6 c2 f4 u8 V
    ! X+ W/ W# n4 e. K0 g
    这完全是谬论。一个程序的速度大部分情况下取决于那个写代码的人,而不是取决于算法。这个观点就像是说印地赛车能跑400千米/小时而一级方程式仅仅能跑360千米/小时一样。尽管那个印地赛车的速度比较快,如果那个开车人不能很好的驾驶它的话…  c0 P& h+ C! Y

    5)如果你学习过C语言,你就能学习现在任何的高级编程语言。因为所有的高级语言都是以C语言为基础的(像JAVA,C++,C#等等)。8 D0 T# J- V  i2 I, I
    8 Z& r" g7 B& x
    大部分的现代计算机语言的学习,早已不仅仅是语法了。.NET和Java都有大量的支持框架,你需要学习的绝不仅仅是那些看起来JAVA,C++,C#都有的的FOR循环。  f6 G2 Z5 K; y$ z) y- B
      D  J9 B8 q7 O& K9 c0 E

    6)因为C语言已经存在很多年了,它有广泛的使用团体并且有大量的现成代码可以利用。这就使你能在过去程序的基础上,快速和高效的编写新的算法和函数。6 a' V4 W$ M9 G8 p4 f  o8 j! K4 h

    嗯…你听说过GOOGLE吗?我用C#,DELPHI和C++编程,已经不记得上一次我找不到一个具体编程问题的解决方法是什么时候了。
    % _2 M7 w% \- X: U
    7)C语言是一个开源组织的语言。一个开源组织的产物--LINUX,就是用C语言写的。如果你会C语言,你就能参加这个组织并且还能向众多的开源组织投稿,比如参加Source Forge并且给他们投稿。
    ~; h. v! n
    我简直不想谈论这个问题。有一个无可争辩的事实是,有同样多的Java、C#或Delphi的开源组织。. p' G! o6 s0 e, h/ j7 {- B. z; g

    ' p! T( K/ c! l6 a9 i" q
    8)C语言是唯一一个向你阐述指针的本质的语言。而C#和Java干脆跳过了指针这个题目。可是指针确实使C语言变得更加强大。  O/ Z7 @* O6 z
    * A# n; Q. Y( I5 L# {
    指针同样是C语言最大的麻烦。我宁愿让Gurus为我写一个编译器或者框架,那样我就不用担心那些最基本的细节了,好让我能够继续编写应用程序。
    找编程开发方面的工作时,C语言仍然是最普遍需要的语言。所以它值得你花时间去学会它。
    这也是值得怀疑的。我估计在这个世界上写COBOL代码的人要更多一些。难道这就意味着我们都应该再去学习下COBOL语言?
    任何里面有微处理器的设备都支持C语言。从微波炉到手机, 都是由C语言技术来推动的。
      X' I8 W9 m* B! t5 r2 ?
      r6 U: X# ?0 r+ I
    是的,C语言可以用来写微波炉和手机的程序,但是经常是有其他选择的。如果我想写手机程序的话,我就能用VB来编。
    f
    别误会我的意思。在适当的环境下使用C语言是非常合适的,我就有可能在80岁以后开始从头学习C语言。但是恕我直言,要是说“每个”程序员都应该学习C语言,那就有点夸张了。

     

     


    ) l. e) v  h4 Y
    #
    2010年8月17日 15:48
  • 其2:C语言已经死了,5个需要忘却它的理由

    我用C语言编程已经超过20年了。我写过C语言的编译器、C语言的调试器、用C开发的其他语言、游戏、客户端程序和服务器程序,你说吧!还有什么是我没写过的。还有我的书架上充斥着折了角的K&R和Steele的书。我太了解C语言了,但是,我讨厌他。十分讨厌!  g4 `$ g* }* Y, F" [
    ; w& y- T- f* ~3 e4 Z0 c
    当我读到一篇博客,题目是“为什么每个程序员都应该学习C语言?”(http://developer.51cto.com/art/200612/36504.htm)时,我真是鸡皮疙瘩满地。如果你真的是个专业的程序员的话,你肯定觉得这是个天大的笑话,尽管作者的本意也许不是这样的。这篇反驳的文章:“每个程序员都应该学习C语言?我可不这么认为”(http://developer.51cto.com/art/200612/36505.htm)有点意思,但是还是没有抓住本质。所以我展开了说一下。有以下5个原因来说明,为什么那些会C语言,并且使用C语言的程序员,现在不但应该去用别的语言,而且应该忘记他们学习C语言过程中的那些烦人的东西。

    1、内存分配1 O) G; v- W% v& p9 D# a  i1 d
    仅仅关于这一点我就能写整整一篇文章了,也许能写一本书,甚至还有可能写出能够塞满图书馆技术书籍那块,那么多的内容。内存分配和存储单元分配的存在确确实实是个大麻烦。你要不就是分配太少的内存不够用,要不就是分配了太多内存浪费掉。这里的问题就是:怎么把它初始化为零呢?还是干脆就不初始化它。但最挠头的步骤还是释放内存。所有已有的工具包都会帮助你确认,你是否已经释放了之前分配的每一位的内存,在释放完之后是否永远不使用它,并且会阻止你,永远不要释放它第两次。更严重的是,分配内存和释放内存在C语言中都是很慢的,非常慢。使用内存分配时,要考虑的各种特殊情况,我真是连想都不愿意去想,只要问题(对象)的大小合适,我更愿意使用栈空间或者事先分配的结构空间。如果这么做的话,我就有更值得烦恼的事了。话说回来,发明垃圾处理器那人真应该得诺贝尔奖。/ u8 n, q7 t9 S5 ^3 X
    ! m  q9 z: m! {% F
    2、多线程

    我过去是喜欢C语言的,真的。直到我开始用C开发并维护多线程的服务器。在为连接相冲突的线程保护数据方面,C语言没有为程序员提供那怕一点点的帮助。你在使用单线程的日子里获得的每一个直觉、经验,用在多线程的时候都是错误的。至少JAVA有表示同步的关键字和备有证明文件(但是是个很奇怪的文件)的记忆体,但即使是这样,除非你使用新的javax.concurrent,否则也只能在那些巨大的平行摆放的机器们面前崩溃。回到C语言上:在模拟生产的环境下,坚持一个星期在数据中心调试一个死锁(这事真的发生过)。而JAVA却只需要Ctrl+Break!天哪!!!

    3、指针3 o! z' F9 U0 I4 s

    指针太难以控制了,太阴险了;我甚至没有委婉一点的方式去形容它。我生命中每年都有几个月被用来调试那些奇怪的指针问题。我过去常常努力获取所有的诀窍,比方说难以理解的构成符、联合体和偏移量,以及重用最后两位做标记,还有所有其他的诀窍。但我发现这么做根本不值得。其他语言的静态引用就可以解决了。1 G1 Y( E: ]4 j% [* l/ K
    ; v6 ~8 }9 F! L$ p' e' N, P
    4、过早的优化( m8 @3 j1 U( o, i: U* F+ S
    + p) S  m; _7 e0 F& d
    说到诀窍,你是否曾经浪费脑细胞去研究究竟*p++是不是比p[ i ]快?你是否曾经花时间去试着做点变化来代替乘法,或者去尝试使循环中的倒置运行更快的方法?还在为传递一个参数的速度和反对添加结构,并且传递它的速度一样而苦恼不已?停吧!算法是速度的关键,程序员的水平决定了他会使用那些算法。知道这一点能让你的程序更好,更快一点并且让你的脑袋少扭几个筋。好吧,有一些例子也许可以这样做的……不,你就别那么做就行了!3 y/ M3 d' H$ Y- w

    5、测试
    3 j+ o- T
    你最喜欢的C的单元测试的工具是哪个?嗯…一个也想不到?单元测试一定是一点也不重要,是吧?或者是太麻烦了,很难跟上进度,浪费时间。你可以把这个时间用到更加有用的事情上,让它只占用工作时间的1%,那还比较合适。或者在数据中心,通过优化的没有标记的图形来调试这个仅仅由100个同时在线使用者引起的问题。

    我本来应该继续再说一些原因的,但是5个现在就足够了;说完这些,现在感觉好点了。C以前是非常棒的…那是在1984年的时候。直到今天,那些用C写的新代码都让我感到惊喜…如果你让我比较的话,我觉得C++只是比C稍微好点。如果你想要学些老一点的语言,不妨尝试Forth,Lis,或者APL。这些老式的语言起码能教会你,用不同的而且优雅的方式去思考你的程序。
    ( q' e, ]! \: e1 W# d
    作者简介6 n& x( C9 o- r

    是一位有着丰富编程经验的程序员。他现在致力于使用JAVA和C来开发OLAP客户端和服务器。他业余时间喜欢研究Java、Eclipse和开源软件。他写了很多关于Eclipse的文章和书籍,另外他还是EclipseZone.com的主编。
    2010年8月17日 15:50
  • 从本质上说,指针无处不在,即使在 C# 或者 Java 里面,只是还了一个华丽的名字:“引用类型”。。。

    实质有什么不同呢? 个人认为,害怕指针的程序员永远成不了优秀的程序员。。。个人观点。。。

    再者, Java 是很方便,但是它的底层实现呢?是的,不是所有的程序员都关心底层,但是这就是普通程序员跟优秀程序员的区别。。。你想处于哪个队列中呢。。。

    也许我们永远都不需要写底层的代码,但是学习,或者理解更多的底层知识并不是一件坏事。

     

    ps: 不知道 C 语言有啥单元测试工具不要紧,请勿诋毁 C 没有单元测试工具。。。

    再 ps: 任何语言在多线程环境之下都可能出错,这只跟程序员有关系,与语言无关。。。

    2010年8月19日 5:05
  • 你这个问题很多人都再问。不管Windows编程还是Linux编程,最重要的还是C++语言。C++基础越好学习起来越轻松,另外推荐深入浅出MFC和Windows核心编程
    麻烦把正确答案设为解答。
    2010年8月19日 12:35
    版主
  • 重点是你想要做什么?我建议你学标准C++,不久之前C++之父出了本新书,对于初学者而言是相当不错的。

    如果你想要先知道C++能做些什么的话,请到他的主页看下,http://www2.research.att.com/~bs/applications.html   

    祝你成功。

    2010年8月19日 13:11
  • 你这个问题很多人都再问。不管Windows编程还是Linux编程,最重要的还是C++语言。C++基础越好学习起来越轻松,另外推荐深入浅出MFC和Windows核心编程
    麻烦把正确答案设为解答。


    谢谢版主和楼上这位朋友!

    还有一问,就是深入浅出MFC这本书好象出了很久了吧。

    WINDOWS核心编程已经买了几个月了,基础没打好还没看。

    但是我还借了两本1998年的上下册的《WINDOWS程序设计》,里面好象是C语言版的。

    请问《WINDOWS程序设计》这本书有必要先学吗(如果不打算用C的话),还是直接看《核心编程》?

    2010年8月19日 18:05
  • 重点是你想要做什么?我建议你学标准C++,不久之前C++之父出了本新书,对于初学者而言是相当不错的。

    如果你想要先知道C++能做些什么的话,请到他的主页看下,http://www2.research.att.com/~bs/applications.html   

    祝你成功。


    谢谢,我有了其它一些语言的基础,如VB、C和汇编,请问这本书好吗,这本是入门书吗,看完后有高级的书介绍吗

    2010年8月20日 1:57
  • 《Principles and Practice Using C++》,是入门的,既适用于教学,也适合自学。该书的英文版是去年上市的,我看了其中的一部分,相当的不错。现在,中文版也已经上市了,听说中文版没有原版的那种彩色内容,不过翻译得不错。作者是这样子介绍它的:

    No, this is not the 4th Edition of The C++ Programming Language (that book cannot be written until we have C++0x ready). It is an introduction to programming for people who has never programmed before. It will also be useful for people who have programmed a bit and want to improve their style and technique - or simply learn modern C++. It is designed for classroom use, but written with an eye on self study. Drafts have been used as the basis for first programming classes for electrical engineer, computer engineer, and computer science students at Texas A&M University for three years now.

     

    《The Design and Evolution of C++》描述C++语言的发展历史、设计理念及技术细节,是最值得阅读的C++书籍之一。C++为什么是这样的?你可以在该书中找到答案。

    关于C++的书籍十分多,并且好书不少。我认为没有人比C++之父更懂C++,因此推荐以上两本书。 

    如果你希望在Windows下和Linux下编程的话,就学标准C++吧。

     其它关于STL的书籍可以帮你更加了解你的库。

    2010年8月20日 11:24
  • 这本书也太入门了吧,我看了网上的简版,有几章内容,前四章都是给没有一点编程经验的人看的

    2010年8月23日 7:27
  • 编程语言是个信仰问题…… C和C++还是两大阵营,更别说C和Java了。其实哪门学通了都可以,只要不要浅尝则止。不建议你学MFC,封装的太落后了,太难用了,说实话是该淘汰了。要是只做界面的话,找本Qt教学的书,比MFC强太多了。要是需要学习多线程这些和系统相关比较紧的东西,那就直接看Win32 SDK中的API就行了。
    0xBAADF00D
    2010年8月23日 7:45
    版主