今天我参观了一所大学的计算机科学系的开放日,在实验室参观期间,我们坐下来讨论了几个来自本科生的期末项目。其中一个特别好——一种FPS小行星游戏。我决定在EDOCX1 0目录中窥视一下,发现它是在C++中完成的(大多数其他项目是Java 3D应用程序)。
我以前没有做过任何C,但我以前看过一些C代码。从我在这个游戏中看到的.cpp代码来看,它看起来并没有什么不同。
我对C或C++学习很感兴趣,但以后可能会学习其他的。对我来说,先学后学有什么好处吗?如果有,那是哪一个?
- 副本:stackoverflow.com/questions/171126/…
- 它不是真的复制品。这个问题也隐含地问"我应该先学习OOP还是过程编程?"
- 在下降到下面的答案(IMO,他们进入圈子),让我提供一些忠告:真:C++确实保留了所有应用于C的特征和属性,从而隐含地"过时"C(下面的大部分答案试图做)。但是:C不是,不是,不是死的。人们似乎掌握了"没有必要同时学习两者"这一比喻来表达亲爱的生活,但事实上,这并没有根据。借用源自C、C++的语法!知道C++不会使你成为一个合格的C开发人员,同样,知道C不会使你成为一个合格的C++开发者。
- 也就是说:在深入研究C++之前,在C上没有什么坏处。你知道的越多,你就越好。相反,如果你的终极目标是学习C++,就不需要学习C。如果你想学习C++,去学习C++,如果你不想学习C,去学习C。两者的优点和缺点(C的简单性和超深的特点——C++都是他们自己的诅咒和祝福),并且两者都在今天仍然被使用(C用于嵌入式系统,Unity,PHP等-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标识为语言对的"does-stufacture"部分非常容易。学习C++首先会导致程序员的困惑和误导。
- Matt:我先学习C++,我不是一个误导的程序员。所以你的说法是不正确的,反例证明。是的,我也有一个C级的金徽章。事实上,它们是两种不同的语言。你不需要一种语言作为学习另一种语言的依赖。这只是一个愚蠢的误解。
- 马特:也是从我的联系帖子:你应该先学习C++,而不是因为学习C首先会伤害你,不是因为你必须忘掉任何东西(你不会),而是因为首先学习C没有益处。无论如何,你最终会了解C的所有内容,因为它或多或少包含在C++中。
- @布莱恩:但是先学C有好处。C的使用更广泛,更简单,更快的学习,更便携,并导致更好地理解C++。我不怀疑C++程序员可以学习C,否则建议是荒谬的。不过,我更喜欢更多的程序员知道C,而不是少数程序员只知道部分C++。关于哪个先出现的问题是很简单的:C打开更多的门,学习速度更快,并且无论如何都需要理解C++,你不妨从掌握这一基本语言开始,而不是害怕C++的黑暗角落。
- @布莱恩:我可以补充一点,在查看了您的配置文件之后,对于最初局限于您的Windows(可能是Visual Studio)的开发,C的选择可能会很差。VisualStudio是一个糟糕的C编译器,所以使用C的一个子集更好地完成Windows上C的学习。但是,这并不影响我对C在所有平台上的一般使用的看法。
- @马特:对不起,你还是不明白。绘制C和C++的维恩图并查看相交的部分。C++是由你画的整个C++循环组成的,而不仅仅是不相交的部分。如果你碰巧知道C,对你有好处,你可以更快地学习C++。如果你不碰巧先了解C,就没有理由先学习它。你认为C++上的每本书都不包括指针和内存管理,以及字符串文字等吗?我现在要停止讨论了,但请留下你的结束语。
- @布莱恩:也许在"需要"和"应该"这两个问题上存在分歧。我的论点是,在上面列出的所有优点之前,应该学习C++之前的C语言。C是值得自己学习的,是C++的好踏脚石,但不是你要指出的。OP使用了"应该"和"优势"两个词。最后,我要说的是,一个人应该首先学习C,因为把C作为一种独立的语言,有着巨大的优势,我在前面的评论中已经列出了这一点。
- Matt:C是如何导致对C++的更好理解的?通常,学习C++的C程序员最终会写出难看的、容易出错的"C类"类代码。我并不是说这种情况总是发生,但从C开始,这是最自然的进展,因为C比C++更接近于那种可怕的C++风格。
- @贾夫:我不确定这有什么关系。OP询问是否知道C或C++之前的优势。我相信一个人应该知道C无论如何,而且最好是先学习C(不超过数周)的不可否认的值(见上面的注释),而不是花费数年学习C++(一个相对的利基语言,现在C和JAVA在横冲直撞),并且不理解C。现在考虑使用C++ 0x有效地需要重新学习C++的大部分和完全调整自己的风格。你现在能把C++ 03编码成可怕的吗?
- @ MattJoiner:如果你从C++中"烧掉"C++,那你就错了。我同意,为了编写高性能的程序,通常重要的是要知道计算机在你的抽象下面是如何工作的,但是,你应该首先设计你的程序是做什么的,而不是它是如何做的。一个好的C++抽象的要点是,不要把它烧掉。C++之所以是一种很好的语言,是因为它能让你抽象出某些不相关的细节,同时仍能保持和C一样好或更好的性能。
- "我能在心理上""C++提供的语法糖"——没有人相信这是一个合格的C++程序员。
- 我会理解,建议在学习Java之前不需要学习C,因为后者的内存处理。然而,在学习C++之前,不学习C是不可原谅的,因为在某种程度上,如果你忽略C(因为C是一个子集),那么你就不学习C++了,而且你失去了一个很好的机会来理解为什么某个C++构造是有用的,因为它发现在C.做这些事情是多么尴尬。
- 看到你的答案和下面的一些答案,我最终决定把我的精力投入到学习C++作为我的第二语言以外的VBA。谢谢你的回答和我的(++1)。:)
我喜欢这个问题,就像问"我应该先学什么,滑雪还是滑雪"?我想这要看你是想滑雪还是想滑雪。如果你想两者兼得,你就必须学会两者。
在这两种运动中,你都会使用与之十分相似的装置在雪地上滑下山来引发这个问题。但是,它们也有很大的不同,因此学习一个对另一个没有太大帮助。与C和C++一样。虽然它们在语法上看起来非常相似,但是编写OO代码与过程代码所需的思维定势是完全不同的,因此您几乎必须从一开始就开始,无论您学习的是什么语言。
我先学习C,在学习C++之前,我学习了C语言的数据结构课程。这对我很管用。C语言的数据结构课程让我对指针和内存管理有了扎实的理解。一旦我了解了面向对象的范式是什么,它的好处就显而易见了。
另一方面,通过学习C语言,我已经养成了一些习惯,这些习惯最初导致我编写坏的C++代码,例如指针的过度使用(当C++引用时)和预处理器。
C++是一种非常复杂的语言,有很多特点。不过,它并不是C的超集。而是有一个C++的子集,包括基本的程序设计构造(循环、IFS和函数),这与C非常类似。在你的例子中,我将从这个开始,然后用我的方法学习更高级的概念,比如类和模板。
最重要的是,imho,在你的大脑冻结成一种看待世界的方式之前,尽早接触到不同的编程模式,比如程序化的、面向对象的、功能性的和逻辑性的。顺便说一下,我也强烈建议您学习一种函数式编程语言,比如Scheme。它真的会扩大你的视野。
- 我不敢相信你还没有得到任何支持,这是一个。我特别喜欢你的最后一段。
- @韦恩,谢谢。
- @迪玛:第二段中诚实的话加1。我经历了一个写非习性坏C++的阶段,后来通过改掉一些旧习惯来纠正自己。
- 我想我先从C开始。
我不同意大多数人的意见。我认为你应该在学习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开始。基本上就是这样。
- + 1。C是一种更小的语言,因此更容易学习。与C向后兼容的尝试是C++主要问题的一个来源,另一个是模板系统,对于90%的C++程序员来说,模板系统太复杂了。
- @希拉:同意。C++和C在它们各自的路径上越快越好。
- 对变量、类型(包括指针和资格)、范围、函数、预处理器和链接的理解对于C和C++都是必不可少的。我想说,用C学习这些概念会更容易,这样您就不必同时处理已知类、static的另一个含义、模板(以及编译器发出的令人毛骨悚然的模板错误)等。
- 你说得对。实际上,学习C可能是好的,这样你就可以更好地了解C++的根。
如果你决定同时学习这两种语言(正如其他人提到的,没有明确的需要同时学习这两种语言),那么首先学习C。从C到C++感觉就像是一种自然的进展,另一种感觉就像是故意把一只手绑在背后。-)
我认为你应该先学C,因为我先学C。C给了我一个很好的语法掌握,并与指针一样的东西,所有这些都流入C++。
我认为C++可以很容易地把所有的GOCHAs包起来(当使用[]操作符和一个闪避索引时,需要一个不会溢出的数组)吗?当然,创建一个数组类来进行边界检查),但是在理解为什么要以某些方式进行操作之前,您需要知道它们是什么,并被它们咬到。
当一切都被说和做的时候,C++通常被教导的方式是"C++是有对象的C,这里是C的东西,这里是所有这些OO的东西是如何工作的",所以如果你遵循大多数文本,你很可能在任何C++之前学习基本C。
- 我不同意。任何到C++编程的书都至少有一些"GoCHAs",比如数组如何工作(以及如何防止溢出)。
C语言是软件工程的必备语言。C++、Java、Python都不是。你应该毫无疑问地先学。
- Amen。从实际的角度来看,这一点是不言而喻的。
- 我不同意-我的C软件工程师不需要知道C才有效。
- @但你怎么知道的?也许如果他们学习C,他们会更有效。
- @德曼:或者他们的效果会差一点。谁知道呢?如果他们把时间花在学习哈斯克尔身上,也许会更有成效?或红宝石。或方案。
- "C是软件工程的必备语言。"?需要引文!
- @我们什么时候成为维基百科的?
- @韦恩康拉德:没有人说我们"变成了维基百科",但是整个工程界的一个共同点是你应该用证据来支持你的主张。这个答案没有证据,并且有可疑的说法。
在学习C++的过程中,你也将学习C的大部分内容。但是请记住,很多C++代码是无效的。C+++被设计成与C代码兼容,所以我首先说学习C++。布赖恩写了一个很好的答案。
学习C迫使您在编写代码时更仔细地考虑一些问题,例如显式和隐式内存管理或基本数据类型的存储大小。
一旦你达到了C的特性和错误特征的舒适点,在C++中学习和写作的难度就会降低。
您所看到的C++代码完全不同于标准C,但很可能是因为它不是面向对象的,而且不使用异常、对象定位、模板或其他高级特性。
不。
学习C++是更有用的,因为它更接近最现代的面向对象的语言,如Eiffel或C.*。
如果你的目标是学习C++,首先学习现代,标准C++。把Mallocs放在一边。
但是史蒂夫罗有一个观点…
就像生活中许多其他问题的答案一样,这要看情况而定。这取决于您的编程兴趣和目标是什么。如果您想用GUI编程桌面应用程序,那么C++(和OOP)可能是一个更好的方法。如果你对x86芯片组以外的硬件编程感兴趣,那么C通常是一个更好的选择,通常是因为它的速度。如果你想创建一个新的媒体播放器或者写一个商业应用程序,我会选择C++。如果你想对星系碰撞或流体动力学进行科学模拟,看看C的力量。
- 现代C++在效率方面与C没有太远的距离。除非有数百个CPU周期在这里和那里会有所不同,否则我会选择基于任务的C/C++,而不是性能。
- 在许多高性能计算场景中,这几百个时钟周期确实很重要。
- 学术界普遍喜欢C,尤其是那些高性能、科学的C,这是有原因的。
- @Mattjoiner:无知还是便携性?
- @ ScottieT:考虑到除了EDCOX1外,0指定符C没有其他与C++相关的性能相关的句法/语义结构,为什么你认为C++代码,其更丰富的语法和例如元编程应该产生更慢的代码?你知道表达式模板吗?
- @短语:相关性。C++是一种极其复杂的语言,其特征往往不值得购买。作为一般规则,C在复杂度上以明显更小的成本给出与C++相同的性能机会。
- @Mattjoiner:可维护性/可扩展性也是性能因素,尽管我认识到科学代码通常是一次性的。然而,重复表达式模板参数(作为一个例子),我说C++有更多的优化机会,(也因为它比内部代码更容易编写表达式模板代码),有一个例外(EDCOX1,0),但是所有主要的C++编译器都提供了一个扩展。你真的认为,给定相同的代码,在同一个编译器之间,C++和C之间的性能会有什么不同吗?[…]
- @ MattCouer-:[…],当阅读诸如"我不喜欢C++"这样的语句时,让我假设你在这个讨论中有点偏颇。你认为C++代码的性能到底有多差?如果C有相同的性能机会,那么表达式模板、一般模板、非固有数据类型的编译时计算、函数等的等价物是什么?添加成本/可维护性因素:RAII、运算符/函数过载、通用标准容器、标准线程、通用标准算法、参考?
在观察了人们首先学习Java之后,在C++中与指针和内存管理的概念进行斗争,我认为学习C首先是一个好主意,为了掌握这两个概念,与其他C++特性的复杂性隔离开来。
我的两分钱:
我建议先学C,因为:
- 它是一种基本语言——许多语言都是由C语言衍生而来的。
- 更多的平台支持C编译器,而不是C++,即嵌入式系统、GPU芯片等。
- 根据TiOBE指数C仍然是2倍的流行比C++。
我认为先学C是个好主意。
有一个原因是comp sci课程仍然使用c。
在我看来,这是为了避免所有的"拥挤"的主题物质的义务,要求OOP携带。
我认为程序化编程是最自然的开始学习编程的方法。我认为这是真的,因为在一天结束的时候,它就是你拥有的:一行接一行执行代码。
今天的许多文本都在推动"物体优先"的方法,并在引入阵列之前开始谈论汽车和换档。
- 现在看来,许多COMP SCI课程使用Java,这加剧了你所讨论的问题。
- 你说得很有道理。除了对第一语言太复杂之外,C++在很大程度上鼓励隐藏与操作系统和内存的低级别交互,这对良好的计算机科学学费至关重要。数组应该早于对象设定。
- 另一方面,如果你不擅长数学,函数式编程可能更自然,因为它看起来、感觉和工作起来更熟悉。
- "有一个原因是comp sci课程仍然使用c。"是的,因为大多数comp sci课程的教学都很差。
我认为C语言是一种非常好的编程语言,它很紧凑,而且有点容易学习。但是如果你只想学习C++的C++入门。但我建议你两个都学。如果你想这样做,我想最好从C开始:它很小,学习起来也很容易。可能是一个很好的步骤,以更复杂的编程语言作为C++。(因为C为您提供了一些基础知识)
祝你好运。
一些C++书籍假设读者对C有最小的知识,但是无论你选择哪种语言都不是错误的方式,因为很多编程语言都是基于C/C++的部分,对于将来的学习来说,其他语言会更容易一些。
- 这是一个历史的产物,因为许多第一代C++程序员最初是C程序员。同样,大多数早期Java书籍都假定某种程度的C++知识。