C for Java Programmer?

时间:2010-08-21 18:39:40

标签: java c++ c

  

可能重复:
  Should I learn C before learning C++?

作为一名专业(Java)程序员和沉重的Linux用户,我觉得学习一些C是我的责任(尽管我可能从不专业地使用它),只是为了让我成为更好的程序员。

两个问题:

  1. 我应该先尝试使用C或C ++ - 我发现它们是不同的语言,有一些共同点。学习两者,或者只尝试一个是有用的吗?我听说C ++是一种语言的噩梦。

  2. 像我这样的Java开发人员有哪些最好的资源(书籍,教程,练习程序,参考代码)。

  3. 由于

7 个答案:

答案 0 :(得分:28)

C学习简单,难以掌握。作为Java程序员,屏障将是内存和结构 ..并且撤消Java 可能已经对生成大脑部分的算法所造成的损害;)

我建议您通过Internet上的教程熟悉Linux机箱上的GCC工具链。然后阅读The C Programming LanguageLinux Application Development的副本不会受到影响。此外,在Linux glib上将免于重新发明轮子...但至少尝试创建自己的链表,哈希图,图表和其他API来学习。指针算术,数组和学习元素(如结构体)只是二进制块中的命名偏移量都很重要。花时间与mallocfree以及memcheck。使用C,您的工具和工具链非常重要,IDE在学习时不一定是您的朋友。

我会选择C over C ++,因为C是习惯C的内存管理和指针使用的良好基础。

您可以做的最好的事情是应用您对实际项目学到的知识。但是要准备好在ValgrindGDB中分配你的头。我已经编程C多年了,我仍然不是C和尚。

我同意C是一种很棒的语言,它会显示出一个糟糕的程序员。但请记住:

  

任何足够复杂的C程序都包含一个临时的,非正式指定的,错误缠身的,一半Common Lisp的缓慢实现。

其道德也是学习其他语言,而不仅仅是C衍生的语言!考虑一些Lisp方言,Erlang(目前很酷),Haskell等。他们将从Java的2x2单元扩展你的视野。考虑一下SICP

答案 1 :(得分:25)

来自ASM,C,然后是C ++,最后登陆(强制)进入Java领域,我想我可能会对这个主题提出意见。

首先,在充分尊重Java社区的情况下,业务经验表明,虽然C / C ++程序员可以习惯Java原理和编程(可能不那么容易),但相反的情况却很少发生。换句话说,C ++程序员必须学习和处理大量的Java规则(框架......),但她最终(并且通常)能够通过注入生成长期工作代码她的很多系统体验到了这个过程。一个Java程序员转到C,用于更多的理论原则和严格的结构规则可能

  • 感到不安全,因为她必须决定很多事情,比如项目组织和结构
  • 对指针和内存管理感到惊讶:分配和释放,必须仔细考虑 - 发现内存泄漏的世界
  • 感到气馁,因为在JVM通过200行堆栈跟踪指示的控制台中,错误不会显示为白色的黑色,但可能发生在更深/系统级别,可能由于前面的IDE而被捕获Java程序员将在她生命中第一次考虑一些汇编代码
  • 对于什么算法以及如何实现它感到困惑,这是一个集成到Java中的,她从来不必担心...

所以,现在,我的任务是帮助您在学习C / C ++之前感到安全,自信和积极性!

我的建议是从C开始,因为

  • C本身拥有您从未面对Java的所有概念
  • 作为Java程序员,你已经有了一个类'方法',从C ++开始,你可能会想要坚持Java OO原则
  • C原则仅限于少数。在进入汇编语言的黑暗世界之前,C看起来像是人类最后的事情。

我在C研究期间要强调的是,例如

  • 指针 Java当然使用指针,但在实际将类作为指针传递给方法时隐藏了它的访问权限。在C中,您必须了解valuereference之间的区别。此外,char x[3]char *x = "ab"之间的细微差别。指针是如何方便通过数组等...,你知道*++x*x++。关于指针的说法很多,我的建议是

    1. 始终保持控制,即在没有必要时不要放置太多的间接
    2. 不要typedef指针,例如typedef int *pointerToInt;一开始看似乎更容易(pointerToInt pi而不是int *pi)几个级别后,我更喜欢计算星星而不是'指针'[一些大cies那样做]。除了函数的指针,无论如何都是不可读的。
  • 内存当您需要内存时,您可以分配它,当您不再需要它时,您可以释放它。简单。事情是分配适当的金额,而不是两次释放...必须习惯。并习惯堆,堆栈......当你的程序运行并解决NULL(0)时,你可能会有一个可见的异常。也许不是。

  • 数据结构所以你想使用方便的HashMap?当然,你开发之后。或者有一些图书馆你可以链接做那种事情,只选择正确的。公平地说,当用C编程时,你[必须]认为不同,并且可能找到比给定问题的映射更合适的算法。

总而言之,一开始你会感到迷失方向,但最终(除非你做噩梦)你会发现很多乐趣和快乐的空间。 C允许一个人完全自由地编程:C根据你的想法而不是相反。

答案 2 :(得分:11)

如果我们的目标是让你成为更好的程序员,那就是针对那些真正尝试与众不同的语言。 Java,C ++和C都密切相关。

是的,一个主要是一个过程语言,一个尝试真的很难假装成OOP,一个是至少4种不同范式的混合,但它们都是命令式语言,它们都有很多语法,基本上,它们都属于同一类语言。

学习C不会教你任何戏剧性的新东西。 可能会教你一些关于内存布局的内容,但是你可以通过许多其他方式了解它,而且它与Java程序员的关系并不是很相关。

另一方面,语言相对容易上手,并且被广泛用于很多Linux软件,所以如果你想为这些语言做出贡献,那么学习C是个好主意。它只是不会让你成为一个更好的Java程序员。

对于C ++来说,把它称为“语言的噩梦”可能与事实并不遥远。对于那些粗心大意的初学者来说,它既庞大又复杂,充满了奇怪的陷阱和陷阱。

但它也有一些救赎品质。首先,它是支持泛型编程范例的唯一语言之一,它允许您非常简洁地表达许多高级概念,并具有高度的灵活性和代码重用。

这种语言可能会让你讨厌C ++因为这样一个过度设计的混乱,而所有其他语言都缺少C ++功能,这使得你的代码变得如此简单。

再一次,学习C ++不会对你作为一个Java程序员产生巨大的影响,除了它会揭示Java中你到目前为止还没有发现的一些缺点。

学习任何一种语言都是好的,但更好的是学习不同的

学习SML或Scheme或Haskell。或Ruby,Python或Smalltalk。 Erlang或Occam怎么样?或Prolog。

学习一些不是Java的兄弟或祖先的东西,这些东西是从头开始设计的,与Java没有任何共同之处。学习像SML这样的函数式语言,或像Python这样的动态类型语言,或者从根本上改变处理并发性的方法,如Erlang。

答案 3 :(得分:7)

  1. 这取决于您想要学习什么。我认为最好坐下来考虑一下你为什么要真的这么做。如果Java做了你想做的事情,而你只是出于一些错位的责任感,我认为可能有更好的方法来度过你的时间。 C ++作为“噩梦巨头”的声誉主要是由不安全的Java程序员传播,他们试图在他们的心中证明他们知道这是一个二流的选择 1
  2. 有几本专门为Java程序员学习C和/或C ++编写的书籍。虽然它不是专门针对Java程序员的,但如果您决定使用C ++而不是C,我会考虑Acclerated C++
  3. 1 当然,我至少有点开玩笑,但是有几乎相当多的Java程序员似乎都有自己的筹码。如果你告诉使用Python或Ruby的人(仅举几个例子)它很慢,那么典型的反应是他们看起来有点困惑并且说:“如果你这么说 - 对我来说似乎足够快。”关于Java的建议几乎可以保证产生你明显无知并且只表达盲目仇恨的声明。

    编辑:就C和C ++之间的选择而言,对于习惯于Java的人来说,C只会是一种挫败感。语言的差异无论如何都需要相当大的调整,但是从Java大小的库移到C大小的库只会导致他的生产力摧毁很长一段时间,并且更有可能再次损害他所有语言的“C” “在名义上帮助他实际学习任何东西。

    直接从Java搬到C就像是一个运动型汽车的想法,就是当他驾驶林肯城市汽车而不是在豪华轿车里接受驾驶时,当他决定赛车很酷的时候,你把他直接扔到座位上一辆奥特洛短跑车。给他一个机会(不仅更安全,但实际上更快)街头合法跑车......

答案 4 :(得分:5)

关于(1),我可能会说C.这是更多的外国人。由于你的目标是多语言本身,所以转向一种与Java大不相同的语言可能比学习C ++更有用,这可能会让你生气。 C ++从人们那里得到了很多废话,并不一定非常糟糕,但主要原因是它试图强迫一种新的范式进入C的结构,这种结构不如以这种范式开头的语言一样好用首先。

对于(2),我强烈推荐K&R。它假定一些编程熟悉,简洁,重点,但也足够深入解释概念。但是,它不包括练习,你必须在其他地方找到它。我在工作中学到了C,我很害怕(而且还在付钱!)所以我不能在那里给你提供有教育的帮助。

答案 5 :(得分:4)

因为你是为了自我实现和学习而做的,所以我说要破产并试试C ++。

在我详细说明之前的一个小前言:我过去主要使用C ++,并且从未使用过任何大小的C代码。现在我在大多数情况下使用C#,在极少数情况下只使用C ++。

我认为C ++是更好的选择,因为:

  • 这是C的部分超集: C程序通常不会编译为C ++程序,但两种语言之间的重叠程度足够大,以至于你不应该很难重新编写 - 如果需要,可以掌握使用C代码的技能。
  • C ++将为您介绍更多概念:您将获得内存管理的所有乐趣,并且您可以在C中进行简单的讨论。但是您也可以看到像您这样的泛型之前从未见过它们,如何独立于容器编写算法,如何进行编译时多态,有时多重继承如何实用,等等。
  • 您将学会更多地欣赏Java语言的设计: C ++是一种复杂的语言,有许多陷阱和边缘情况(参见FAQ和{{3一些例子)。通过亲自体验它们,您将能够更好地理解制作Java和C#的许多设计决策。

归结为:你学的越多,你就能学到的东西越多。而且C ++强迫你学习很多东西,绝对比C更强。这是一件好事。

答案 6 :(得分:2)

C ++可能比C更熟悉,并且可能更容易实现高效率。但是,C语言要小得多,而且学习起来应该相当简单(尽管要小心;通过学习C,你会有永久性脑损伤的风险)。我的个人参考是Harbison& Sons的“C:A Reference Manual”。斯蒂尔(现为第5版)。对于C ++,我只使用O'Reilly的坚果壳书。

作为一名具有一定C ++经验且目前正在向Java过渡的C程序员,我可以告诉你关于C的事情可能会让你几乎立刻绊倒你:

  • C几乎没有抽象的方式;指针和字节流几乎就是它。没有标准容器类型(列表,地图等)。你想要比固定长度数组更复杂的东西,你必须自己滚动(或使用由其他人开发的库)。
  • C中没有垃圾收集这样的东西。你动态分配的每个字节(通过malloc()calloc())你都可以解除分配(通过free())。
  • C中的数组 not 的行为与Java中的数组相似;关于阵列类型有一些时髦的规则,乍一看没有意义(并且直到有足够的脑损伤才会出现)。对数组没有边界检查,并且一些标准库函数(特别是gets()scanf())使缓冲区溢出漏洞成为真正的风险。
  • C声明语法可能变得非常扭曲。虽然你可能不会看到任何非常丑陋的东西,但int *(*(*(*f)())[10])();之类的声明是可能的(f是指向函数的指针,该函数返回指向返回指向int`的函数的10元素指针数组的指针。
  • C实施限制因平台而异;例如,语言标准仅强制shortintlong等类型的最小范围,但它们可能比最低要求更宽。如果您期望int无论平台如何都始终保持相同的大小,那么您可能会遇到一些惊喜。
  • C中的文字处理是 ass 的痛苦。认真。 C没有这样的字符串类型。