Suld I learn C before learning C++?
作为一个专业的(Java)程序员和沉重的 Linux 用户,我觉得我有责任学习一些 C(即使我可能永远不会专业地使用它),只是为了让我成为一个更好的编码器。
两个问题:
我应该先尝试 C 或 C ++-我意识到它们是不同的语言,有一些共同点。学习两者都有帮助,还是只尝试一个?我听说 C ++ 是一种语言的噩梦庞然大物。
对于像我这样的 Java 开发人员来说,最好的资源(书籍,教程,实践程序,参考代码)是什么。
谢谢
C 简单易学,难以掌握。作为 Java 程序员,障碍将是内存和结构..并消除 Java可能对算法产生的大脑部分造成的损害;)
我建议你一定要熟悉你的 Linux 盒子上的 GCC 工具链,通过互联网上的教程。然后阅读The C Programming Language,和一个副本Linux Application Development不会伤害。另外,在 Linux 上glib会让你免于重新发明轮子...但至少尝试创建你自己的链表,hashmap,graph 和其他 API 来学习。
我会选择 C 而不是 C ++,因为 C 是习惯 C 的内存管理和指针使用的良好基础。
你能做的最好的事情是将你所学到的应用到一个真正的项目中。但是要准备好在Valgrind和GDB中将你的头撞在墙上。我已经为 C 编程多年了,但我仍然不是 C 和尚。
我同意 C 是一种伟大的语言,它显示了一个糟糕的程序员。
任何足够复杂的 C 程序都包含 Common Lisp 的一半的临时,非正式指定,错误缠身,缓慢的实现。
其寓意也是学习其他语言,而不仅仅是 C 派生的语言!考虑一些 Lisp 方言,Erlang(目前很酷),Haskell 等。他们将从 Java 的 2x2 单元格扩展您的视野。也可以考虑SICP。
来自 ASM,C,然后 C ++,最后登陆(强制)进入 Java 领域,我想我可以提供关于这个主题的意见。
首先,在充分尊重 Java 社区的情况下,业务经验表明,尽管 C / C 程序员可以习惯 Java 原理和编程(可能并不那么容易),但相反的情况很少发生。换句话说,C 程序员将不得不学习和应对大量的 Java 规则(Frameworks...),但她最终(通常)将能够产生更多的长期工作的 Java 原理代码。
感到不安全,因为她必须决定许多事情,例如程序组织和结构
对指针和内存管理感到惊讶:分配和释放,必须仔细考虑-发现内存泄漏的世界
感到沮丧,因为错误不会在 JVM 通过 200 行堆栈跟踪指示的控制台中出现黑白,但可能发生在更深的 / 系统级别,可能由于 IDE 而被捕获,Java 程序员将在她的生活中第一次考虑一些汇编代码
对于什么算法以及如何实现它感到困惑,这是她从未担心过的集成到 Java 中的一个...
所以,现在,我的任务是帮助您在学习 C / C ++ 之前感到安全,自信和动力!
我的建议是从 C 开始,因为
C 本身拥有所有的概念,你从来没有面对与 Java
作为一个 Java 程序员,你已经有了一个类 '方法',从 C ++ 开始,你可能会坚持 Java OO 原则
C 原则仅限于少数。在进入汇编语言的黑暗世界之前,C 看起来像是人类的最后一件事。
例如,我在 C 研究期间要强调的是
指针Java 当然使用指针,但是在实际将类作为指针传递给方法时隐藏了它的访问。在 C 中,您将必须学习 byvalue
和 byreference
之间的区别。此外,关于char x[3]
和char *x = "ab"
的更细微的区别。我的指针是通过数组等
始终保持控制,即在不必要的时候不要太多间接
不要typedef
指针,如typedef int *pointerToInt
;在几个级别之后,起初似乎更容易(pointerToInt pi
而不是int *pi
),我更喜欢计算星星而不是 'pointerTo' [一些大的 cies 这样做]。
内存当你需要内存时,你分配它,当你不再需要它时,你释放它。简单。事情是分配正确的数量,而不是释放它两次...必须习惯这一点。并习惯堆,堆栈...当程序运行并寻址 NULL(0)时,您可能会有一个可见的异常。也许不是。
数据结构所以你想使用一个方便的 HashMap?当然,在你开发它之后。或者有一些你可以链接的库来做这种事情,只是选择了正确的一个。公平地说,在用 C 编程时,你 [必须] 考虑不同,并且可能会找到一个比给定问题的映射更合适的算法。
总而言之,起初您会感到迷失方向,但最终(除非您做噩梦),您会发现在您面前有很多和的空间。C 允许一个人完全自由地编程:C 按照您的想法进行,而不是相反。
如果目标是让你成为一个更好的程序员,那就瞄准那些实际上试图与众不同的语言。Java 、 C++ 和 C 都是密切相关的。
诚然,一种主要是程序语言,一种非常努力地假装成 OOP,一种是至少 4 种不同范式的混合,但它们都是命令式语言,它们都有很多语法,基本上,它们都是同一语言家族的一部分。
学习 C 不会教给你任何新的东西,可能会教你一些关于内存布局之类的东西,但是你可以通过许多其他方式来学习它,它只是与 Java 程序员不太相关。
另一方面,该语言相对容易掌握,并且广泛用于许多 Linux 软件,因此,如果您想为其中任何一个做出贡献,那么学习 C 是一个好主意。它不会使您成为更好的 Java 程序员。
至于 C ++,称它为“语言的噩梦庞然大物”可能离事实不远。它又大又复杂,对粗心的初学者来说充满了奇怪的陷阱和陷阱。
一方面,它是唯一支持通用编程范式的语言之一,它允许你非常简洁地表达许多高级概念,并具有高度的灵活性和代码重用性。
这是一种语言,可能会让你讨厌 C ++ 是这样一个过度混乱的混乱,以及所有其他语言缺少 C ++ 功能,这将使你的代码更简单。
同样,作为一个 Java 程序员,学习 C ++ 不会对你产生巨大的影响,除了它会揭示 Java 中的许多缺点,你直到现在才意识到。
学习任何一种语言都是好的,但更好的是学习不同的。
学习 SML 或 Scheme 或 Haskell。或 Ruby,Pytn 或 Smalltalk。Erlang 或 Occam 怎么样?或 Prolog
学习一些不是 Java 的兄弟或祖先的东西,这些东西是从头开始设计的,与 Java 没有任何共同之处。学习像 SML 这样的函数式语言,或者像 Pytn 这样的动态类型语言,或者像 Erlang 这样从根本上改变你处理并发的方式的语言。
这取决于您想要学习什么。我认为最好坐下来考虑为什么您真的要这样做。如果 Java 按照您的意愿进行操作,而您只是出于某种错位的责任感而这样做,那么我认为可能有更好的方法来花费您的时间。/ C ++ 作为“噩梦巨兽”的声誉主要是由不安全的 Java 程序员传播的,他们试图证明自己的选择是合理的。
有几本书是专门为学习 C 和 / 或 C++ 的 Java 程序员编写的。虽然不是专门为 Java 程序员编写的,但如果你决定使用 C++ 而不是 C,我会考虑Acclerated C++。
1当然,我至少是在开玩笑,但是几乎有惊人数量的 Java 程序员似乎肩上扛着一块芯片。如果您告诉使用 Pytn 或 Ruby 的人(仅举几个例子)它很慢,典型的反应是他们看上去有些困惑,并说:“如果您这么说,但对我来说似乎足够快,那么对 Java 的无知肯定会产生仇恨。”
编辑:就在 C 和 C ++ 之间进行选择而言,对于习惯于 Java 的人来说,C 只是一种挫败感。无论如何,语言的差异都需要进行相当大的调整,但是从 Java 的大小移动到 C 的大小只会在相当长的一段时间内他的生产力,并且更有可能再次以“C”为名损害他的所有语言,而不是帮助他实际学习任何东西。
直接从 Java 转移到 C 就像带一个人的运动型汽车的想法是当他驾驶林肯城市汽车而不是在豪华轿车中担任司机时,当他认为赛车很酷时,您将他直接丢在座位上 Outlaw sprint 汽车。首先给他一个机会(不仅更安全,而且实际上更快)进入街头合法的跑车...
本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处
评论列表(63条)