有人说C语言已经过时了,学程序设计应该从面向对象语言开始。在这一点上我持保留意见。
1、关于C语言的学习
    在Linux下,大部分的程序还是C语言实现的。Win32 API仍然是用C语言实现的。
    WINDOWS平台C++应用广泛是微软力推的结果,但是现在WINDOWS平台应用软件的开发,有向C#偏移的趋势,这要看VISTA系统推行的效果。到时候,恐怕大家又要跟风似的去学习C#了。作为初学者,不要盲目地去追时髦,到头来吃到苦头的永远是你自己。就像C#,当你刚刚熟悉2.0版本以后,3.0版本已经问世了,又要勿勿忙忙搭上3.0的列车。。。时代在不断进步,技术在不断发展,我们要明白我们真正要学的基础是什么?就像物理学一样,在没有学习经典力学之前,就想学习最新的相对论思想,这可能吗?
不管C++、java、C#怎么发展,不管WINDOWS平台青睐于哪种开发语言。C语言仍然是程序设计入门语言的首选。过早的接触面向对象,会让你忽于对计算机底层的了解。没错,编程首先是以人为主,然后才考虑机器.但是,只考虑人,而完全不考虑机器是大错特错的,那会导致你为所欲为,以为自己想到的,计算机就一定可以实现。然而,事实告诉我们,事情并不是我们想的那样.
    在编译器层面上,C++的实现最终仍然会被展开为C形式的,完全没有封装的代码。程序,最终还是要在机器上运行。只有面向对象,而没有C基础,在理解计算机底层技术的时候,还是要回过头来学习C语言的编程思想的。
    美国在使用java等面向对象语言作为入门语言几年之后,现在已经又重新考虑使用C作为入门语言了,原因,正如我前述所说。
    此外,Linux倡导的编程艺术是简单美。在今后相当长的时间内,Linux平台下的软件开发还是以C为主,当然,不排除KDE界面是用的C++,WEB开发使用java。
    至于编程思想的发展趋势,现在C++积极提倡泛型编程的概念,这与面向对象是完全不同的概念,也是编程思想的一次革新。泛型同面向对象的结合,可以产生良好的效果。java和C#等面向对象语言也跟随其后,提供了对泛型编程的支持。但无疑,C++在泛型编程方面是推进得最好的。
2、C++的学习
    建议学习C++从《C++ Primer》等经典外国名著入手,使C++的学习完全不依赖于平台。
    毕竟,C++最先是在Unix系统,在贝尔实验室提出来的。只是在WINDOWS上得到了发扬光大而已。
    一开始就轻视语言本身的学习,过早陷入MFC类库,会让你不能理解C++语言的真谛,写出的C++代码只能是C式的C++,这也是国内很多C++初学者常走的弯路。
    C++社区的大牛们现在都推荐把C++当作一门全新的语言来学习,完全与C区别开,使程序员不再写C式的C++代码。
    C++发展了二十年,已经不是简单添加了类封装的C语言了。如果你依然这么认为,那么你对C++的认识还停留在上个世纪80年代。
    然而,我在上面又说学习要先打好基础,那不是要从最初的C++思想学起吗?确实,我们应该了解C++的历史,这对于我们理解这门语言非常有用。但并不是要你抱着80年代的C++书籍埋头苦读,而是伴随在moder C++的学习过程当中。C式的C++相对于modern C++有太多的缺点,我们干嘛不学最好的方法呢。就像物理学一样,其中的经典理论也经过了由错到对的过程,那么,我们还要从错误的思想开始学习吗?学习C语言,我们也要从ANSI C未出现之前学习吗?当然不是,基础,并不代表就是陈旧的东西。
    但是,在国内,C++标准库的使用并不广泛,很多人对C++的使用依然停留在对C代码的简单类库封装上。这是很可悲的。还好,从2000年开始,大量现代C++名著被引入国内或者翻译为中文版,越来越多的人开始接触modern C++。
国内的C++社区,也涌现出了侯捷、荣耀、刘未鹏等少壮派高手。
还是那句话,学习C++一定要看国外名著,谭浩强、钱能的C++书还是放到一边吧,他们在误人子弟。
    C++大牛们推荐首选使用STL标准库,因为它与平台无关,而且抛弃了C语言中的种种缺陷和陷阱。但是人家没有推荐MFC之类。
    充其量,MFC,现在我只用来做界面框架,因为自己用SDK敲界面框架实在太麻烦了。然而MFC并不是唯一选择,WTL、QT都是不错的界面库。而且,实际上MFC的封装模式早已跟不上C++的步伐,要知道MFC推出时,C++仍未标准化。然而MFC却没有跟着C++的发展不断重构自己的类库,实际上MFC基础架构根本没有什么大的变化。
    而现代C++类库,如STL、ATL、WTL、BOOST、ACE、LOKI等等,都充分结合了泛型和面向对象的优点,是现代C++的完美体现。MFC类库,我承认,其中仍有许多东西值得我们学习。但是针对C++的设计思想来说,他的架构已经过时了,它仍然停留在对C语言的API简单封装的层次上,到处是稀奇古怪的宏代码。这是不值得我们再学习的。
    至于进程和线程等底层处理,则直接使用API,即可以提高运行效率,又对于你认识操作系统很有帮助。
    在代码的整体风格上,应该使用modern C++。在算法和数据处理上,尽量使用STL。只有使用到操作系统API的时候,才使用C语言。当然这其中有个C++代码与C语言API交互的问题,其实很简单,主要发生在vector和string上。
    最后,学习编程关键在于学习思想,不要禁锢于语言的细枝末节上。
    C语言是程序设计的基础,C++的泛型思想可谓是程序设计思想的尖端、潮流。
    在掌握基础之后,学习顶尖的设计思想,就如同轻车熟路一样,非常轻松。
个人观点:
    风格是修养,语法是外功,算法是内功,练好这3种才是真正高手!