在学习C ++之前应该学习C吗?[关闭]


117

我今天在开放日参观了大学CS系,在实验室参观中我们坐下来参加了一些本科生的期末项目。一个特别好-一种FPS小行星游戏。我决定看一下src目录,以发现它是用C ++完成的(其他大多数项目都是Java 3D应用程序)。

我以前没有做过C,但是之前已经看过一些C代码。从我在该游戏的.cpp代码中看到的看,它看起来并没有太大不同。

我对学习C或C ++感兴趣,但稍后可能会学习其他。是否有任何优势,我一个学习之前,其他如果是的话,哪一个?



7
它实际上不是重复的。隐式地,这个问题还问“我应该先学习OOP还是过程编程”
bobobobo

2
在给出以下答案之前(IMO他们圈出了圆圈),请允许我提供一些建议:TRUE:C ++ 确实保留了应用于C的所有功能和属性,因此隐式地“ 弃用了 ” C(下面大多数答案的要点尝试制作)。但是:C 不是不是不是死亡。人们似乎已经掌握了“ 无需学习这两种说法”的珍贵生活,但是实际上,这没有根据。从C,借语法始发C ++!= C。了解C ++不会使您成为合格的C开发人员,同样,了解C也不会使您成为合格的C ++开发人员。
超级猫

4
在于所述的:有没有危害,采取基于C钻研之前到C ++ -知道得越多,就越是-但相反的,有没有必要学习C,如果你的最终目标是学习C ++。如果你想学C ++,去学习C ++,如果你想学牛逼C,去学习C。两者都有优点和缺点(C的简单性和C ++的-ultra-depth-features都是它们自己的诅咒和祝福),并且两者至今仍在使用(C用于嵌入式系统,Unity,PHP等-C ++也适用于Unity,虚幻等)。
超级猫

3
要点: 想学习C ++吗?然后跳过C。您不需要它。想学习C吗?那就好,去学习C。如果你两者都学习,那就先去学习C。他们俩在世界上都有自己的位置,所以不要认为任何一个对另一个都是足够的。
超级猫

Answers:


121

在学习C ++之前不需要学习C。

他们是不同的语言。一个普遍的误解是,C ++在某种程度上依赖于C,而不是完全依赖于完全指定的语言。

仅仅因为C ++共享许多相同的语法和语义,并不意味着您需要首先学习C。

如果您学习C ++,最终您将学习大部分C语言,并且随着时间的流逝,它们之间的语言会有一些差异。实际上,编写适当的C ++很难,因为中级C ++程序员倾向于编写C / C ++。

如果您首先了解C,那么对学习C ++来说是个不错的选择。您将从了解一部分语言开始。如果您首先不了解C,那么没有必要关注另一种语言。有很多不错的书籍和教程,使您从一无所知开始,涵盖了您从C中学到的所有知识,这些知识也适用于C ++。

请参阅此答案中的进一步推理


33
我完全同意。首先学习C ++会使“返回” C的经历变得非常困难。C是一种基本的,仅基础知识的系统语言。C ++是一个全新的游戏,用任何一种语言解决任何问题的方法都会大相径庭。在进入C ++工作之前,我很幸运地尝试过使用C。随后,我能够在脑海中“摆脱” C ++提供的语法糖,并且可以解决任何一种语言的问题。对于我来说,很容易将C识别为语言对中的“确实”部分。首先学习C ++会导致程序员感到困惑和误导。
马特·乔纳

24
@Matt:我是第一个学习C ++的人,不是一个被误导的程序员。因此,您的主张是不正确的,请通过反例进行证明。是的,我在C中也有一个金牌。事实是,它们是两种截然不同的语言。您不需要一种语言作为学习另一种语言的依赖。那只是一个愚蠢的误解。
Brian R. Bondy 2010年

8
@Matt:也来自我的链接文章:您应该首先学习C ++,不是因为首先学习C会伤害您,不是因为您将不得不学任何东西(您不会),而是因为先学习C没有好处。无论如何,您最终都会学习有关C的所有知识,因为C ++或多或少都包含了C。
Brian R. Bondy 2010年

11
@Matt:对不起,您仍然不了解。绘制C和C ++的维恩图,并查看相交的部分。C ++由您绘制的整个C ++圆组成,而不仅仅是不相交的部分。如果您碰巧首先了解C,这对您有好处,那么您可以更快地学习C ++。如果您不是碰巧首先了解C,则没有理由先学习C。您是否假设每本有关C ++的书都不会涵盖指针和内存管理以及字符串文字等?我现在将停止讨论,但随时保留您的总结意见。
Brian R. Bondy 2010年

11
@Matt:C如何使人们更好地理解C ++?通常,学习C ++的C程序员最终会编写难看的,容易出错的“带有类的C”样式代码。我并不是说总是会发生这种情况,但这是从C开始时最自然的进展,因为C比“现​​代” C ++更接近C ++的这种可怕风格。
jalf

76

我喜欢这个问题-就像在问“我应该先学什么东西,单板滑雪还是滑雪”?我认为这取决于您是想要滑雪还是滑雪。如果您想两者都做,则必须同时学习。

在两种运动中,您都使用足够类似的装置在雪地上滑下山来引发这个问题。但是,它们也有很大的不同,因此学习一个对另一个没有帮助。与C和C ++相同。尽管它们看起来在语法上是足够相似的语言,但是编写OO代码与过程代码所需的思维定势是足够不同的,因此无论您学习第二种语言,您都必须从头开始。


70

我首先学习了C,在学习C ++之前,我上了一门使用C的数据结构的课程。这对我来说很好。用C编写的数据结构课程使我对指针和内存管理有了深入的了解。一旦我了解了面向对象范式的好处,它也就显而易见了。

另一方面,通过首先学习C,我养成了一些习惯,这些习惯最初使我编写了不好的C ++代码,例如过度使用了指针(当C ++引用可以使用时)和预处理器。

C ++实际上是一种非常复杂的语言,具有许多功能。但是,它实际上不是C的超集。而是有一个C ++的子集,它由基本的过程编程构造(循环,if和函数)组成,与C非常相似。在您的情况下,我将从此开始,然后逐步研究更高级的概念如类和模板。

恕我直言,最重要的事情是,在您的大脑陷入一种审视世界的方式之前,就要尽早接触不同的编程范例,例如过程,面向对象,功能和逻辑。顺便说一句,我也强烈建议您学习一种函数式编程语言,例如Scheme。它将真正扩大您的视野。


18

如果您决定同时学习这两种语言(并且正如其他人提到的那样,则无需明确学习这两种语言),请先学习C。从C到C ++感觉很自然。换另一种方式就像是故意将一只手绑在背后。:-)


13

我认为您应该首先学习C,因为我首先学习了C。C让我很好地掌握了语法和诸如指针之类的陷阱,所有这些都流入了C ++。

我认为C ++可以很容易地包装所有这些陷阱(需要一个在使用[]运算符和狡猾的索引时不会溢出的数组?当然,要创建一个进行边界检查的数组类),但是您需要知道什么在您理解为什么以某些方式完成工作之前,他们会被他们咬伤。

说完所有的话,通常讲授C ++的方式是“ C ++是带有对象的C,这是C的东西,这是所有这些OO东西的工作方式”,因此,如果您愿意的话,您可能会在学习任何真正的C ++之前先学习基本的C。无论如何都遵循大多数文本。


我不同意。
精打细算的

11

我不同意这里的多数意见。我认为您应该在学习C ++之前学习C。绝对没有必要,但是我认为这使学习C ++变得容易得多。C是C ++的核心。您所学到的关于C的任何知识都适用于C ++,但是C的体积小得多,而且容易学习。

拿起K&R并仔细阅读。它简短,可以使您对语言有足够的了解。一旦有了指针和函数调用的基础知识,就可以更轻松地升级到C ++。


15
错误。C教给您的几乎所有内容都是C ++的错误做法。C不是C ++的核心,它恰好共享许多语法。拜托,全世界已经有足够的“带有类的C”程序员了。学习C或C ++。但是不要假装C是C ++精简版。
jalf

13
我坚持我的话。C ++建立在C之上,因此C是其核心。C ++中使用的习惯用法与C中使用的习惯用法有很大不同,但是语法是相同的。可以学习从C开始进行C ++编程的正确方法。请看C ++ Primer。它基本上做到了。
Steve Rowe)

6
+1。C是一种较小的语言,因此更易于学习。向后兼容C的尝试是C ++主要问题的根源之一,另一个原因是模板系统过于复杂,以至于90%的C ++程序员都无法使用。
丘卢

1
对变量,类型(包括指针和限定符),范围,函数,预处理器和链接的理解对于C和C ++都是必不可少的。我要说学习使用C这些概念会更容易,这样你就不必还应对了解不同阶层的另一种意义static,模板(和可笑的恐吓模板的错误,编译器发出)等
dreamlax

1
你有一定道理。实际上,学习C可能是件好事,这样您就可以对C ++的起源有更深入的了解。
Daniel Daranas 2014年

10

在学习C ++的过程中,您还将学习大部分C语言。但是请记住,许多C ++代码都不是有效的C。C++旨在与C代码兼容,因此我想先学习C ++。布赖恩为此写了一个很好的答案


8

学习C会迫使您在编写代码时更加思考一些问题,例如显式和隐式内存管理或基本数据类型的存储大小。

一旦您对C的功能和缺点感到满意,那么使用C ++学习和编写代码的麻烦就会减少。

您所看到的C ++代码看起来很可能与标准C并没有太大区别,但这很可能是因为它不是面向对象的,并且没有使用异常,面向对象,模板或其他高级功能。



7

就像生活中许多其他问题的答案一样,这取决于。这取决于您的编程兴趣和目标。如果您想使用GUI对桌面应用程序进行编程,那么C ++(和OOP)可能是更好的选择。如果您对非x86芯片组上的硬件编程感兴趣,那么C通常是一个更好的选择,通常是因为它的速度。如果您想创建一个新的媒体播放器或编写一个业务应用程序,我会选择C ++。如果要对星系碰撞或流体动力学进行科学模拟,请注意C的作用。


4
在许多高性能计算方案中,那几百个时钟周期确实很重要。
Scottie T

1
@ScottieT:既然除了说明restrict符C 之外,C没有其他与性能相关的语法/语义结构,那么您为什么还认为C ++代码具有更丰富的语法和元编程(如元编程)应该产生较慢的代码呢?您甚至知道表达模板吗?
塞巴斯蒂安·马赫

1
@phresnel:相关性。C ++是一种极其复杂的语言,具有通常不值得购买的功能。通常,C可以提供 C ++ 相同的性能机会,而复杂性却要低得多。
马特·乔纳

1
@MattJoiner:可维护性/可扩展性也是性能因素,尽管我意识到科学代码通常是一次性的。但是,重复执行expression-templates-argument(作为示例),我说C ++具有更多的优化机会,(也因为与内部代码相比,编写Expression-template-code容易得多),但有一个例外(restrict,所有主要的C ++编译器都将其作为扩展提供)。您是否真的认为,如果使用相同的代码,使用相同的编译器,C ++和C在性能上会有任何区别吗?[...]
塞巴斯蒂安·马赫2013年

1
@MattJoiner:[...],当阅读诸如“我不喜欢C ++之类的语句”之类的语句时,我可以建立一个假设,即您在本次讨论中略有偏见。您究竟认为什么会使C ++代码性能更差?如果C具有相同的性能机会,那么表达式模板,通常的模板,对非本征数据类型,函子的编译时计算等价于什么?并增加成本/可维护性因素:RAII,操作员/函数重载,通用标准容器,标准线程,通用标准算法,参考?
塞巴斯蒂安·马赫

7

我认为先学习C是个好主意。

comp sci课程仍然使用C是有原因的。

在我看来,它避免了要求OOP承担的所有“拥挤”主题。

我认为过程编程是最先学习编程的最自然的方法。我认为这是正确的,因为到最后,您所拥有的是:一行又一行地执行的代码行。

如今,许多文本都在倡导“以对象为先”的方法,并在介绍数组之前开始谈论汽车和变速箱。


4
如今,似乎许多comp sci课程都使用Java,这加剧了您正在谈论的问题。
Dima

2
你说的很好。除了对于第一语言而言过于复杂之外,C ++在很大程度上还鼓励隐藏与操作系统和内存的低级交互,这对于良好的计算机科学学业至关重要。数组应该比对象早教。
马特·乔纳

1
另一方面,如果您不擅长数学,则函数式编程可能会更自然,因为它在外观和感觉上和工作上都更加熟悉。
塞巴斯蒂安·马赫

2
“ comp sci课程仍然使用C是有原因的。” 是的,因为大多数计算机科学课程的教学质量很差。
Lightness Races in Orbit

6

观察到先学习过Java的人都在努力应对C ++中的指针和内存管理的概念后,我会说,先学习C是一个好主意,以便掌握这两个概念,与其他C ++的复杂性隔离开来。特征。



3

我认为c是一种非常不错的编程语言,它紧凑且易于学习。但是如果您只想学习c ++,请从c ++开始。但我建议您同时学习两者。如果您想这样做;我认为最好从c开始。如前所述:它很小,而且易于学习。可能是对像c ++这样的更复杂的编程语言的不错的提升。(因为c为您提供了一些基础知识)

祝好运。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.