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

Posted

技术标签:

【中文标题】我应该在学习 C++ 之前学习 C 吗? [关闭]【英文标题】:Should I learn C before learning C++? [closed] 【发布时间】:2009-02-28 19:46:08 【问题描述】:

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

我之前没有做过任何 C 语言,但我之前看过一些 C 代码。从我在这个游戏的 .cpp 代码中看到的,它看起来并没有太大的不同。

我有兴趣学习 C 或 C++,但以后可能会学习另一个。 先学习一个对我有什么好处如果有,是哪一个?

【问题讨论】:

这不是真正的重复。这个问题也隐含地问“我应该先学习 OOP 还是过程编程” 在下降到以下答案之前(IMO 他们绕圈子),请允许我提供一些建议:TRUE:C++ 确实保留所有应用于 C 的特性和属性,因此隐含地“废弃”C(下面的大多数答案都试图说明这一点)。 然而:C notnotNOT DEAD。人们似乎抓住了'没有必要同时学习'的比喻,但实际上这是没有根据的。借用源自 C 的语法,C++ != C。了解 C++ 不会使您成为合格的 C 开发人员,同样,了解 C 也不会使您成为合格的 C++ 开发人员。 如是说:在深入研究 C++ 之前学习 C 是没有害处 - 你知道的越多,你就越好 - 但是在相反,如果您的最终目标是学习 C++,则没有必要学习 C。如果你想学习 C++,去学习 C++,如果你想学习 C,去学习 C。两者都有优点和缺点(C 的简单性和 C++ 的超深度特性以它们自己的方式既是诅咒也是祝福),并且今天仍然在使用(C 用于嵌入式系统、Unity、php 等 - C++也适用于 Unity、Unreal 等)。 要点: 想学 C++? 那就跳过 C。你不需要它。 想学 C 吗? 那么好,去学 C。如果你两者都学,那就先学 C。他们在世界上都有自己的位置,所以不要认为其中任何一个对另一个就足够了。 【参考方案1】:

在学习 C++ 之前无需学习 C。

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

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

如果您学习 C++,您最终将学习 C 的大部分内容,但随着时间的推移您将学习的语言之间存在一些差异。事实上,编写正确的 C++ 是一件非常困难的事情,因为中级 C++ 程序员倾向于编写 C/C++。无论您是从 C 开始还是从 C++ 开始,这都是事实。

如果您先了解 C,那么这是学习 C++ 的好帮手。您将从了解大量语言开始。如果您首先不了解 C,那么专注于不同的语言是没有意义的。有很多不错的书籍和教程可供您从一无所知开始,并且涵盖了您将从 C 中学到的任何适用于 C++ 的内容。

Please see further reasoning in this answer.

【讨论】:

我完全不同意。首先学习 C++ 会导致“回到” C 的非常困难的体验。C 是一种基本的、仅限基础的系统语言。 C++ 是一个全新的球赛,任何一种语言解决任何问题的方法都会大相径庭。在跳入 C++ 工作之前,我很幸运能够修补 C。随后,我能够在精神上“蒸发”C++ 提供的语法糖,并且可以解决任何一种语言的问题。我很容易将 C 识别为语言对的“做事”部分。先学 C++ 会导致程序员的困惑和误导。 @Matt:我先学了 C++,我不是一个被误导的程序员。所以你的说法是不正确的,通过反例来证明。是的,我也有 C 语言的金徽章。事情的真相是它们是两种截然不同的不同语言。你不需要一种语言作为学习另一种语言的依赖。这只是一个愚蠢的误解。 @Matt:同样来自我的链接帖子:你应该先学习 C++,不是因为先学习 C 会伤害你,也不是因为你必须忘掉任何东西(你不会),而是因为那里先学C没什么好处。无论如何,您最终将了解有关 C 的所有内容,因为它或多或少包含在 C++ 中。 @Matt:很抱歉你还是不明白。画出 C 和 C++ 的维恩图,看看相交的部分。 C++ 由您绘制的整个 C++ 圆组成,而不仅仅是不相交的部分。如果您碰巧先了解 C,对您有好处,您可以更快地学习 C++。如果您不是碰巧先了解 C,就没有理由先学习它。你是否认为每本关于 C++ 的书都不会涉及指针和内存管理以及字符串文字等?我现在将停止讨论,但请随时离开你们的闭幕式。 @Matt:C 如何让人们更好地理解 C++?通常,学习 C++ 的 C 程序员最终会写出丑陋的、容易出错的“C with classes”风格的代码。我并不是说这总是会发生,但这是从 C 开始时最自然的进展,因为 C 更接近于那种可怕的 C++ 风格,而不是“现代”C++。跨度> 【参考方案2】:

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

在这两项运动中,您都使用非常相似的设备在雪地上滑下山坡,从而引发这个问题。然而,它们也有很大的不同,因此学习一个对你来说并没有多大帮助。与 C 和 C++ 相同。尽管它们在语法上看起来是非常相似的语言,但编写 OO 代码和过程代码所需的思维定势却大不相同,因此无论您第二学习什么语言,您几乎都必须从头开始。

【讨论】:

【参考方案3】:

我首先学习了 C,在学习 C++ 之前,我参加了使用 C 的数据结构课程。这对我来说效果很好。 C 中的数据结构课程让我对指针和内存管理有了深入的了解。一旦我了解了它是什么,它也使面向对象范式的好处显而易见。

另一方面,通过先学习 C,我养成了一些最初导致我编写糟糕的 C++ 代码的习惯,例如过度使用指针(当 C++ 引用会这样做时)和预处理器。

C++ 确实是一种非常复杂的语言,具有许多特性。不过,它并不是真正的 C 超集。相反,有一个 C++ 子集,由基本的过程编程结构(循环、ifs 和函数)组成,它与 C 非常相似。在你的情况下,我将从这个开始,然后逐步了解更高级的概念比如类和模板。

恕我直言,最重要的是在您的大脑冻结成一种看待世界的方式之前,尽早接触不同的编程范式,如过程式、面向对象、函数式和逻辑式。顺便说一句,我也强烈建议你学习一门函数式编程语言,比如 Scheme。它真的会扩大你的视野。

【讨论】:

【参考方案4】:

如果您决定同时学习两者(正如其他人所提到的,没有明确需要同时学习两者),请先学习 C。从 C 到 C++ 感觉像是一个自然的过程。走另一条路感觉就像故意将一只手绑在背后。 :-)

【讨论】:

【参考方案5】:

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

我认为 C++ 可以轻松解决所有这些问题(需要一个在使用 [] 运算符时不会溢出的数组和一个狡猾的索引?当然,创建一个执行边界检查的数组类)但你需要了解它们是什么并被它们咬伤,然后才明白为什么事情会以某些方式完成。

说到底,通常教授 C++ 的方式是“C++ 是带有对象的 C,这是 C 的东西,这就是所有这些 OO 的东西是如何工作的”,所以你可能会先学习基本的 C,然后再学习真正的 C无论如何,如果您遵循大多数文本,则 C++。

【讨论】:

我不同意。任何值得一读的 C++ 编程书籍都将涵盖至少一些“陷阱”,例如数组如何工作(以及如何防止溢出)【参考方案6】:

我不同意这里的大多数人。我认为您应该在学习 C++ 之前学习 C。这绝对不是必需的,但我认为它使学习 C++ 变得容易得多。 C 是 C++ 的核心。你学到的任何关于 C 的东西都适用于 C++,但 C 更小更容易学习。

拿起 K&R 并通读它。它很短,会给你足够的语言感。一旦掌握了指针和函数调用的基础知识,就可以更轻松地转向 C++。

【讨论】:

错了。 C 教给你的几乎所有东西在 C++ 中都是不好的做法。 C 不是 C++ 的核心,它只是碰巧共享了很多语法。拜托,世界上已经有足够多的“C with classes”程序员了。学习 C 或 C++。但不要假装 C 是 C++ lite。 我坚持我的话。 C++ 建立在 C 之上,因此 C 是其核心。 C++ 中使用的习语与 C 中使用的习语有很大不同,但语法是相同的。可以从 C 开始学习正确的 C++ 编程方法。查看 C++ Primer。它基本上就是这样做的。 +1。 C 是一种较小的语言,因此更容易学习。向后兼容 C 的尝试是 C++ 的主要问题之一,另一个是模板系统对于 90% 的 C++ 程序员来说太复杂而无法使用。 了解变量、类型[包括指针和限定]、范围、函数、预处理器和链接对于 C 和 C++ 都是必不可少的。我想说用 C 学习这些概念会更容易,这样你就不必再处理知道类、static 的另一个含义、模板(以及编译器发出的可笑的、令人生畏的模板错误)等等。 你说得有道理。实际上,学习 C 可能会很好,这样您就可以更好地了解 C++ 的根源。【参考方案7】:

在学习 C++ 的过程中,您还将学习 C 的大部分内容。但请记住,很多 C++ 代码不是有效的 C。C++ 旨在与 C 代码兼容,所以我想说先学习 C++。布赖恩为此写了一封great answer。

【讨论】:

【参考方案8】:

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

一旦您对 C 的特性和错误特性感到满意,您在学习和编写 C++ 时可能会遇到更少的麻烦。

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

【讨论】:

【参考方案9】:

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

【讨论】:

在许多高性能计算场景中,这几百个时钟周期确实很重要。 @ScottieT:鉴于除了restrict 说明符之外,C 没有其他与性能相关的句法/语义构造,而 C++ 也没有,你为什么认为 C++ 代码具有更丰富的语法和例如元编程应该产生更慢的代码?你知道表达式模板吗? @phresnel:相关性。 C++ 是一种极其复杂的语言,其特性通常不值得购买。一般来说,C 以显着降低的复杂性成本提供与 C++相同的性能机会。 @MattJoiner:可维护性/可扩展性也是性能因素,尽管我意识到科学代码通常是一次性的。但是,重复表达式模板参数(作为示例),我说 C++ 有 更多 优化机会,(也因为它更容易编写表达式模板代码比内在代码),有一个例外(restrict,但是所有主要的 C++ 编译器都作为扩展提供)。你真的认为,给定相同的代码,给定相同的编译器,C++ 和 C 之间的性能会有什么不同吗? [...] @MattJoiner:[...],当阅读“尽管我不喜欢 C++”这样的陈述时,我会假设您在此讨论中略有偏见。您认为究竟是什么让 C++ 代码的性能更差?如果 C 具有 same 性能机会,那么表达式模板、一般模板、非内在数据类型上的编译时计算、仿函数的等价物是什么?并添加成本/可维护性因素:RAII、运算符/函数重载、通用标准容器、标准线程、通用标准算法、参考?【参考方案10】:

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

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

在我看来,要求 OOP 的义务是为了避免主题的所有“拥挤”。

我认为过程式编程是首先学习编程的最自然的方式。我认为这是真的,因为归根结底,它就是你所拥有的:代码行一个接一个地执行。

今天的许多文本都在推动“对象优先”的方法,并在引入数组之前开始谈论汽车和换档。

【讨论】:

现在看来很多comp sci课程都使用Java,这加剧了您所说的问题。 你说得很好。除了对于第一语言来说过于复杂之外,C++ 在很大程度上鼓励隐藏与操作系统和内存的低级交互,这对于良好的计算机科学教学至关重要。数组应该比对象早教。 另一方面,如果你数学不差,函数式编程可能更自然,因为它的外观、感觉和工作方式更熟悉。 “comp sci 课程仍然使用 C 是有原因的。” 是的,因为大多数 comp sci 课程都教得很差。【参考方案11】:

没有。

学习 C++ 通常更有用,因为它更接近最现代的基于 OO 的语言,例如 Eiffel 或 C#。

如果您的目标是学习 C++,请首先学习现代的标准 C++。将 malloc 放在一边。


但是Steve Rowehas a point...

【讨论】:

如今的 C++ 与 C# 或 Eifel 等 OO 语言并不接近。【参考方案12】:

观察到首先学习 Java 的人在 C++ 中遇到指针和内存管理的概念时,我会说先学习 C 是一个好主意,以便掌握这两个概念,与复杂性隔离开来其他 C++ 功能。

【讨论】:

【参考方案13】:

我的两分钱:

我建议先学C,因为:

它是一种基础语言 - 许多语言都源自 C 支持 C 编译器的平台比 C++ 多,无论是嵌入式系统、GPU 芯片等。 根据TIOBE index,C 的流行度仍然是 C++ 的 2 倍左右。

【讨论】:

【参考方案14】:

我认为 c 是一种非常好的编程语言,它结构紧凑且易于学习。 但如果你只想学习 c++,就从 c++ 开始。但我建议你两个都学。如果你想这样做;我认为最好从c开始。如前所述:它很小而且很容易学习。可能是向更复杂的编程语言(如 c++)迈出的一步。 (因为 c 为您提供了一些基础知识)

祝你好运。

【讨论】:

以上是关于我应该在学习 C++ 之前学习 C 吗? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

学习C++需要先学C吗,为啥?

同时学习 Visual C++ 2008 和 C++?有啥资源可以推荐吗? [关闭]

c 和 c++ 中的指针之间有啥大的区别吗? [关闭]

有经验的 C++ 开发人员应该学习哪种 Web 技术? [关闭]

如何在 C++ 中编写文本编辑器 [关闭]

[C++]C++入门到入土篇 HelloWorld 解析 && C++入门