it-swarm.cn

C ++是否适合作为第一语言?

一家本地大学正在向没有编程经验的一年级大学生(16岁)教授C++。

作为第一门编程语言,C++适合吗?

26
Ed James

强调

对于学生而言,对于任何目标,另一种语言或一系列语言都会变得越来越快。 例子。

“学生需要理解低级概念。”

“低级”编码不包括从new获取对象,将它们反馈回delete,以及偶尔有一个指针指向不应指向的位置。函数,类和模板不是低级的。 RAII,使用conststd::ostream::operator<<protectednew不是低级概念。这些东西具有低级的含义,您将跳过它们几个月,或者直到以后的课程再学习C++语义学。

我建议汇编器具有良好的环境和教学材料,例如MIPS或MMIX。如果您很着急,请绕道教C至少看看汇编器输出。这将使您对C++有所了解,然后再进行一些更快速的了解。

“学生需要了解对象定向。”

C++内置的面向对象的方法过于复杂,无法教授OO概念,或几乎任何其他高级概念。有关 C++ FAQ 的详细列表,请参见-您可能要花所有的时间,而对于新程序员,这将需要非常,非常长的时间;或者您必须跳过很多内容,从而使新程序员陷入困境-实际上,不是真正了解C++!

如果您必须教C++,我建议您先使用对象(Python,Ruby,Squeak,Common LISP,Racket)来学习一种更简单的高级语言。除此之外,通过访问功能语言,将多态性作为与OO)分开的概念来学习。

“学生需要了解模板和模板元编程。”

没有人真正问过这个问题,但我希望他们会这样。 C++具有不错的模板,STL很酷,但是它们不应该被优先考虑教给C++。无论如何,先教OCaml或Haskell类型系统,然后对这些概念进行改造可能会更快。

“学生需要学习解决问题的方法。”

是的,您可以使用任何一种语言来获得此信息,如果使用除C++之外的几乎任何语言都可以获得更多信息,这是因为可以减少行李负担。同样,请参阅 C++ FAQ ,以获取学生将要学习的所有事情的列表,而不是解决问题的技能。

“以上所有,我们只需要使用一种语言。”“雇主想要它。” “我们需要一种C语言。”或...

教一种以上的语言。

通过只教一种语言来节省时间或精力的想法简直是荒谬的。它基于这样的思想:学习任何一种给定的语言都需要X个月的时间( HINT!HINT! ),其中X是一个数字或每种语言一个数字。这几乎与您可以通过跳过所有“要求”和“测试”垃圾来节省时间和金钱的想法完全相同。

至于多种语法,如果让学生疯狂地偏向其他语言,如果教他们期望每种语言都使用C语法,则会危及学生的生命。

几乎所有路径都比从C++开始更快,更好。学习一种简单的高级语言,然后学习C++会更快。学习汇编程序,然后学习C++会更快。除了C++外,其他任何东西都可以使学生更快到达那里,并且他们将了解更多入门方法。 别先教C++。

61
Jesse Millikan

不,即使对于有经验的C++开发人员来说,C++也是一种困难的语言。即使是最简单的算法,您也必须解释许多语言的细微差别。考虑一个Hello World示例:

#include <iostream>

int main()
{
  std::cout << "Hello World!" << std::endl;
}

那是什么 #include命令?什么是 std::cout。为何 ::?什么是 <<?哦,这是个超负荷的操作员!什么是重载运算符?如此,对于ints,它确实会发生位移,但是对于std::cout是,它将内容输出到控制台。哦,std::cout是流,并且流具有<<>>运算符已重载。

让我们看一下Python中的相同示例:

print("Hello World!")

就是这样,让我们​​开始编写一些算法。

54
Marco Mustapic

它可能不是一种很好的第一语言:复杂的语法,很多规则,旧的语言,易于出错的内存管理。最好教给学生更多OO),例如Smalltalk,或者更易于使用Python编程的东西,或者类似Haskell的函数。

在学习了更好的语言之后,他们可以在以后的生活中学习C++(如果他们不能帮助的话)。

21
Andres F.

简短的回答:是的!

我会说any语言是一个合适的起点,但尤其是C++(或等效)。如今,C#和Java是正在使用和编程的主要语言),通过这些语言,您可以快速学习以依赖API和IDE的语言,但是使用C++,您将有机会从头开始学习编程,包括性能。优化等.

在您盲目依赖于.Sort();内建的语言之前,学习编程,循环和排序的基础知识从来都不是一个坏主意。

18
Mantisen

实际上,出于非常实际的原因,我认为作为第一语言可能是一个不错的选择:学习C++之后,您遇到的任何其他语言似乎都非常容易学习。

14
ennuikiller

15-16岁时,我自学了C++。

最好将魔力留给他人,自己学习事物的内部运作方式。


坦率地说,如果您不能弄清入门级的C++语法和语义,您的计算机就不是那么好。没那么难。没有充分的理由避免使用“带有类的C”。

如果您希望学生开始着手进行模板元编程,推导多态调用并弄清多个继承层次结构,那么对于使用任何一种语言的入门级课程而言,这都是荒谬的。

想要掩盖学生编程的复杂性的趋势非常差。最终效果不佳(请参阅Spolsky的Java Schools论文)。如果这些人不敢直截了当,他们最终会进入DailyWTF。抽象会泄漏,以及何时(而非如果)泄漏,这比必须解决的更糟糕。我已经工作作为入门级C++学生的TA。要么必须将所有方法隐藏起来,要么必须将它们暴露出来。魔术是学习者的敌人。

如果我必须推荐一种编译为机器代码的起始语言,那么Pascal变体可能是最好的方法。我记得,与C系列相比,它具有更常规和结构化的方法。

10
Paul Nathan

没有。

作为一种教学语言,C++仅比C稍好,后者是周围最差的教学语言之一。它预先引入了很多复杂性,该语言的某些部分是非常不直观的,并且大多数时候您对C++的了解要比对编程的了解更多。

这并不是说C++(或C)是不好的语言,或者不值得学习。只是有更好的教学语言,例如Python。

8
John Bode

我会说“不”-我有学习编程的渴望和渴望,并且马上就开始了C++的大学入门课程。加上一位正在教C++的老师,好像它是另一门语言(对他们有意义的概念,不一定是该语言或现实世界应用程序的概念),并且每周都有项目马上扔给我们,我因此而崩溃并被烧死一半的班级。到我什至可以消化,试验和应用所学内容的时候,我就为项目功课作了挣扎,而功课却是测试的两倍。我认为这是200级课程而不是100级课程。

我真的尽力了。我没有要求同情,我知道这将是一个挑战,但老师甚至都不会帮助我。只是告诉我像往常一样去读教科书。

我会认为(=有些人会不同意)Ruby或Python是一种更好的语言,可将某人打入编程世界。干净,简洁,易读,语法更清晰。

8
Kevin

专上教育有两种基本类型:大学和商学院。不同之处在于您毕业后要准备做什么。在汽车领域,无论您是机械师还是机械工程师。

话虽这么说,如果您想成为一名工程师,C++是一门很棒的第一语言,而如果您想成为一名相当于机械师的编程,那么它就是一本烂书。

C++入门类将花费大量时间讨论数据类型,定义,声明,指针,内存分配等。如果您打算花费几个学期来学习如何做任何有用的事情,那么这是一个很好的基础,但是想知道一旦到达那里,您就具有处理任何程度的复杂性的基础。

另一方面,如果您希望能够更快地执行有用的操作,但是不介意域和复杂性是否受到限制,那么将所有时间花在这些较低级别的概念上将是浪费。有很多程序员可以编写出色的html表单验证器,但不知道如何设计设备驱动程序。

7
Karl Bielefeldt

当然。我的第一语言是C,但这实际上只是为了使我们的课程简化为C++。上大学后,它使Java变得更容易处理。C++的学习曲线可能会稍陡一些,但是如果教得正确,它应该没问题。

5

不,C++不适合作为第一语言。如此处所示,许多专业程序员都同意这种观点,但这也是专业教师的观点。

这是卡内基梅隆大学(Carnegie Mellon University)院长的 report 关于使用C++作为新生编程入门课程的内容:

诸如C或C++之类的标准语言不适合本课程,因为它们的复杂性和不足会阻碍非正式的和机械化的推理技术。

CMU提供两门入门课程,一门必修课和一门实用课。选择SML进行功能编程。我不知道命令式课程选择了什么,但是报告提到使用C的子集。

4
Joh

不,绝对不会。

如果我愿意的话,我几乎不允许在学术环境中使用它。不是因为与已经提出的原因相反,而是因为太多的人认为C++(或其变体)几乎可以解决所有问题,因为您几乎可以在任何情况下使用它。它是编程的螺丝起子。

有些人用它来拧紧螺丝,这是完成工作的理想工具。其他人像撬棒一样使用它,虽然通常很有效,但并不十分理想,因为螺丝刀(无论您父亲会告诉您什么)都不是撬棒,并且由于误用了柄的组成而可能因滥用而灾难性地失败对于撬杆会遇到的那种力量。还有其他人可能会尝试将其用作打孔器或凿子,并且它们几乎总是会遇到问题,因为螺丝刀的手柄并不是为打孔器或凿子设计用来承受这种冲击而制造的。

我认为,程序员的工作通常是将实际问题转换为自动化,从而在一定程度上提高效率(减少对任务的资源投入),速度(减少执行任务的时间),可预测性(提高可重复性)任务)或组织(提高对任务之间关系的认识)。

可以理解,虽然每个编程人员都应该对计算机的低级操作(尤其是设备IO和内存分配))具有一些常识,但是,真正必须将这种知识用于任何人的情况并不常见在很大程度上,更不用说将其用于绝大多数任务了,而在不了解问题更广泛背景的情况下尝试这样做会给工作带来不必要的风险。

荒谬的是,第一种编程语言应该是C/C++或近似变体,因为C及其派生词所解决的问题类别显然不适用于当前和将来任意大比例的问题(除非必须挽救)一个以前用螺丝起子的程序),而实际上更多的只是一小部分即将到来的问题。尽管小型移动互联设备越来越流行,但大多数程序员永远都不会接近开发核心OS功能或直接设备接口。大多数人会像我们一样工作和生活。修复并逐步淘汰超过两代的代码,或者在已经表现出年龄的技术上实施,或者在killer(x + 1)应用程序的技术边缘进行工作。

对于第一种语言,我将看一下Lego NXT,它是一种轻巧但功能丰富的LabView变体。尽管Lego NXT在商业企业中并未得到广泛使用,但它将展现以“传感器丰富”的方式进行编程的基本本质。我可能将其与某种平台无关的脚本语言(例如Javascript或TCL/TK)配对。就执行非常基本但有效的任务所必须发现的内容而言,这两种方法的影响相对较小,而在反馈回路和灵活性方面具有很高的回报率,从而可以引入和解决不同程度的问题复杂性。另外,它为学生提供了一个很好的机会,使他们能够继续探索超越罐头环境所提供的潜力:有机会在黑暗,潮湿,低水平的设备中尝试工作IO和具有少量开销的自定义驱动程序。

在他们学会了自动驱动四缸发动机之后,如果他们真的很感兴趣和有动力,就将他们提升到大型v8手动hotrod。如果乔尔(Joel)在脚下的任何石头下都找不到摇滚明星程序员,那么他可能不得不继续寻找其他地方,或者重新考虑为什么他的工具箱中可能需要很多螺丝刀。

2
JustinC

当然。还有其他语言可能会使一年级学生更容易掌握。但是,教师可以通过某些方式慢慢地用C++引入概念。

2
jzd

绝对可以C++是第一语言。但这是关于它的教学水平。

大家都说,第一语言应该很容易掌握。但我的意思是,大多数人都开始在本科层次上编程。因此,您可以教他们掌握的知识。借助C++,您可以从较低级别的编程转到更高级别的编程。

2
Gulshan

当我上大学时,C++是整个大学一年级所教授的基础语言。从理论上讲,它包含一些复杂的编程概念,因此,如果您掌握了它,就可以使用其他语言。它为我打下了良好的基础。

话虽如此,在我大四的时候,我曾在一个委员会工作,以确定是否将核心语言切换到Java。在与几位杰出的雇主和该部门的一些校友交谈之后,我们确定切换到Java是学生的最大利益。我们与雇主交谈的雇主希望人们在某行业有经验。他们使用这种语言来雇用他们。我相信,十年后的今天,他们仍然使用Java作为他们的核心语言。

类似地,我们一直在寻找聘请几位具有非常好的C++技能的大学毕业生。我们找不到任何东西。

1
SchwartzE

我会说是的。但是任何一种语言都可以真正成为第一语言。我认为C++很好,因为尽管它很复杂,有时甚至很困难,但它向您展示了您真正可以做的事情(较少的限制)。而且,它具有一些面向对象的设计,可以帮助您准备使用其他语言。

C++是我的第一语言,我很高兴它是。我很早就想到了OOP很大程度上是因为如果您能熟练使用一种语言,那么选择另一种语言就不会有任何问题,您想做什么?制作游戏?手机程序?每个人都会有更适合的工具和语言为了它。

1
user16281

C++是一种专家语言,而不是初学者……首先要说C,而不是Java或C#或Python ...为什么呢?因为C教您注意内存和一些棘手的概念,例如所有语言都“隐藏”了指针,却无处不在。所有的编码工作:即使它们具有XXXXGb RAM,它们也会实例化,实例化并使其爆炸……但是他们不明白为什么垃圾回收器不能简单地神奇地清理所有内容! C++(甚至在Corba中甚至更疯狂),这真是个大问题!!!!然后,当您了解了所有这些内容之后,便开始使用C++,您会感觉到C++的强大功能,但同时也发现了它的所有危险以及为什么它不应该被任何人使用;)

1
mandubian

初学者容易在C++中犯错误的几点是:

在您要测试的地方进行分配= vs ==

失踪 ;

大括号的可读性与例如Pascal开始到结束

然后,所有包含文件,宏,内存管理等都会引起混淆。

因此,我想说C++并不是最好的语言-但是,毫无疑问,当您了解它之后,它可能会非常有用。

我会-正如其他人也建议的那样-使用C#,Java甚至VB-和一个不错的IDE高亮显示,调试器等,以帮助您更轻松地从错误中恢复。

1
Rune Andersen

没有。 C++有很多东西,这使得新手很难理解。不要陷入“所有编程语言都是平等的”谬论。

从Basic或Pascal(忽略“它们已弃用”的东西)开始,然后从C/C++/Java/C#/ Perl开始。或者,如果有机会,请先选择Logo&Karel,然后再选择Basic或Pascal。

P.D.一些大学和同事开设了编程语言用法和比较课程,碰巧我曾教过该课程;-)

1
umlcat

我从中学开始使用C++。我拿起这本书的副本: Deitel和Deitel编写的C++ How to Program 。这本书相当不错。

坦率地说,这里没有对与错的答案,我个人发现C++是可以理解的。我一直学习到OOP(我被“ this”绊倒了,现在我不明白我怎么也听不到,但是不管用)。尝试一下,不要沮丧,如果遇到困难,请检查其他语言并继续学习新语言。其想法是,当您以2-3种不同的形式看到相同的概念时,您会更好地理解它们。就像我说的,“ ”指针使我感到困惑,但是当我在Python(取而代之的是self)中看到相同的东西时,这对我来说很有意义,因为我已经在C++中理解了。请学习Java=,如果您能由许多大学教授的话,请学习python或Ruby,因为这是您的日常语言,如果您可以探索更多的专业领域, /新的东西,例如Clojure(以及所有其他lisps),Haskell,Scala ...

0
nkassis

如果“适当”代表“可能”,则为是。如果说“好”,绝对不会。

有可能喜欢甚至爱C++,但是为此,您最好学习几种语言,并使用烂尾烂烂的代码库工作数十年,获得“制作可实际使用的非凡软件”的经验-然后C++将具有魅力。

处女时,不要一开始就摆弄一些小而简单的问题(但据说很有趣)。

我将从python开始,然后是SICP(方案)或类似的东西。可能颠倒或交错。有了这些,您就可以解决问题。与其在系统中作斗争,不如在泥泞中行走,学习各种不合逻辑的怪癖及其历史原因。

稍后,当您已经可以从纸袋中编程出自己的方式时,切换到裸机:学习组装方式和几种体系结构,以及Knuth's Mix。我并不是要记住操作码或做很多实际的事情,只是为了了解内存,寄存器,ALU,缓存,中断以及达到读取级别。

这样,您便可以使用其他语言,包括C++。在两者之间添加一些“语言的历史和演变”也许是个好主意。

0
Balog Pal

您可以选择任何语言来学习编程的基础。我用C/C++学习了东西。但是7年后,我的学校改变了工具/语言,他们更喜欢Java/C#。语言仅仅是工具。您需要变得更好的是基础。例如在MIT中,人们使用python学习了算法基础。例如Java对于Web编程可能是好的,但是C/C++对于服务和高性能应用程序是有好处的。因此,这取决于您的情况。

0
sarat