浅谈学习C语言与学习C++语言的关系

本文写给 C C++ 语言初学者。

论坛中,常有初学者问“学习 C++ 语言之前是否有必要先学 C ?”。我认为这个问题是个伪问题。问题本身的答案并非是提出问题的人真正想要的。

回答这个问题非常简单:“当然不需要”。因为 C++ 是一门独立的编程语言,它在语法、构建环境和运行环境上都不需要依赖于任何其它语言。至于说它是“ C 语言的超集”,那只是一种模糊的提法而已,更准确的说法应该是: C++ 语言从设计之初就充分考虑了对 C 语言的兼容性,结果使它在相当大的程度上兼容了 C 语言。如此而已。

但对于那样提问的初学者来说,以上会是他们想要的答案吗?我觉得不是。至少问题没有这么简单。

C++ 语言支持多种编程范式:面向过程、面向对象和范型程序设计。它所兼容 C 的部分,也正是支持面向过程的主要部分。有 C 语言的基础,虽然有助于更快地掌握 C++ 的面向过程部分,但由于 C++ 语言本身也直接支持面向过程,因此我们完全可以从 C++ 中直接学习面向过程程序设计,而无需先学 C 。至少理论上如此。

但话又要说回来。注意,提这个问题的大多是初学者。一般讲解 C++ 语言的教程,限于篇幅,面向过程部分无法与一本优秀的 C 语言教程相媲美。于是,真正的问题来了:直接从 C++ 语言开始学习的初学者,他是否愿意像 C 语言初学者那样花大量的时间和精力,专门钻研面向过程程序设计?如果他不愿,那么他对面向过程部分的掌握,就难以跟一个扎扎实实学习过 C 语言的人相比。即使只讨论“ C++ 中的 C ”,结论也是一样。但是,这里我只是想强调这样一个事实,而并非要下个“必需先学 C ”的结论。

我个人在初学 C++ 语言时,觉得教程中学到的好多东西,包括面向对象程序设计,在实践中无法运用自如。后来因工作需要,又去学习 Java 语言,一下子就对面向对象有了一种开窍的感觉。再使用 C++ 写程序时,发现 OO 起来也更顺畅了,我的好几位朋友也有过类似的感觉。究其原因,我想跟上面的分析的 C 语言的情况类似。 C++ 的所支持的特性和编程范式更多,初学者很难快速消化全部。而 Java 1.4 之前,可以认为是纯面向对象的。这样,使用 Java 写程序时,我们被迫实践面向对象编程,这就好比使用 C 写程序,我们被迫实践面向过程一样。而直接使用 C++ 写程序,没有什么“被迫”,我们也就缺少了相应的“专项强化训练”。并非所有的人都需要这种“专项强化训练”,但对于初学者,面对着要掌握的复杂知识体系,它确实能起到“分而治之”的作用,从而促进对知识的消化和吸收。

还有人认为,学会了 C++ 语言,自然就学会了 C 。而我认为这种观点是经不起推敲。我们必需承认两点:第一, C 语言是有用的,这点不用多说,那么多 C 语言构筑起来的项目和复杂系统摆在那里。虽然它没有对包括面向对象在内的各种更抽象的编程范式提供直接支持,但事实早已证明它能解决复杂问题;第二, C++ 语言的设计者所设计的是一门新式的语言,而不仅仅是一个“更好用的 C ”。这就导致 C++ 在继承 C 语言的同时也要对它的各种特性做必要的扬弃。于是,就产生了很多这样的情况:某种特性,在 C 语言中非常重要,但 C++ 语言却拥有一些新的特性来替代它,而且可能做得更好。这样,原来 C 语言中的一些特性在 C++ 语言中虽然还被兼容,却被大大淡化,或不再提倡,甚至一些 C++ 语言的教程中都不提那种特性。这方面的例子很多,比如“宏”, C++ 中有太多可以在各种不同的场合取代宏的东西;再比如可变参数,还有对指针的一些复杂使用等等。这些东西在 C 语言中则非常重要,重要到成为 C 语言之所以“有用”的直接原因之一。因为这些原因,一个用惯了 C++ 语言,而从没单独学习过 C 语言的人,如果有一天突然被要求去负责一个 C 语言项目,我不认为他就一定能轻松搞定。所以,我认为“学会 C++ ,自然也就学会了 C ”的观点是没有道理的。

有人说过,“ C 语言是结构化的汇编”,没错,它的功能、效率和可移植性都很好地达到了它的设计初衷,它对现实项目中的各种问题也都有它独特的解决方式,而同样的解决方式在 C++ 语言中却未必是恰当的(当然反之也成立)。换句话说,从解决实际问题的方式来看,这两种语言谁也包含不了谁。但我们学习程序设计不就是为了解决实际问题吗?那结论已经出来了: C++ 语言从语法上几乎完全包含了 C 不代表它“真正”包含了 C

反过来,一个熟练掌握了 C 语言的程序员,学习 C++ 语言的情况又是怎样的呢?正如前面分析过的, C 语言面向过程的“专项训练”非常有助于迅速掌握 C++ 语言的面向过程部分;而且,大多数人最终都在实际的软件开发中运用编程语言,这使得任何语言的编程背景对其它新语言的学习都会有帮助,比如说学习 BASIC 也可以认为对学习 C++ 有帮助。但不同的语言毕竟是不同的语言, C 语言和 C++ 语言终归体现了不同的编程思想,如果在学习 C++ 语言的过程中,不能适时的忘记并跳出 C ,有时可能阻碍对 C++ 编程思想的理解和掌握。

最后,有必要提一下, C 语言在其最新的标准中还加入了一些新的特性,它们当中的一些 C++ 语言并没有办法直接“兼容”,甚至未来的 C++ 语言也不一定会兼容它们。比如栈上分配的动态数组。

想说的就这些了,总结一下:

1 )学习 C++ 语言不需要以任何其它语言的学习作为基础,包括 C ;但是,

2 )不要指望学会了 C++ 语言,就等于同时掌握 C++ C

3 )也不要指望学过一遍 C++ 语言,面向过程的编程水平就一下子可以跟上专门学习过 C 语言的程序员;

4 )学好了 C ,对学习 C++ 有很大的帮助,但要更好的学习 C++ 语言并掌握其编程思想,有时需要适时地忘记并跳出 C

 

再浓缩一下,其实只想说一句话: C C++ 是两门不同的编程语言,只是它们有较大的联系。

 

http://blog.csdn.net/steedhorse/archive/2007/12/17/1942871.aspx

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值