|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本文写给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语言和C++语言终归体现了不同的编程思想,如果在学习C++语言的过程中,不能适时的忘记并跳出C,有时可能阻碍对C++编程思想的理解和掌握。
最后,有必要提一下,C语言在其最新的标准中还加入了一些新的特性,它们当中有一些C++语言并没有办法直接“兼容”,甚至未来的C++语言不一定会考虑兼容它们。比如栈上分配的动态数组。
想说的就这些了,总结一下:
(1)学习C++语言不需要以任何其它语言的学习作为基础,包括C;但是,
(2)不要指望学会了C++语言,就等于同时掌握C++跟C;
(3)学好了C,对学习C++有很大的帮助,但要更好的学习C++语言并掌握其编程思想,有时需要适时地忘记并跳出C。
再浓缩一下,其实只想说一句话:C和C++是两门不同的编程语言,只是它们有较大的联系。
|
|