C for Java Programmer?

luc*_*001 24 c c++ java

可能重复:
我应该在学习C++之前学习C语言吗?

作为一名专业(Java)程序员和沉重的Linux用户,我觉得我有责任学习一些C(即使我可能永远不会专业地使用它),只是为了让我成为一个更好的编码器.

两个问题:

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

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

谢谢

Aid*_*ell 29

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

我建议您通过Internet上的教程熟悉Linux机箱上的GCC工具链.然后阅读C编程语言,Linux应用程序开发的副本不会受到影响.此外,在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.

  • @jalf - 我不同意.毫无疑问,C很简单,但美在应用和优雅.掌握是制作漂亮的C程序,而不是像垃圾一样对待记忆和逻辑的程序. (6认同)
  • 呃,C并不是特别难以掌握.C++很难掌握,这就是为什么C更适合某些项目的原因. (2认同)

Rin*_*g Ø 25

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

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

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

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

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

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

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

  • Pointers Java当然使用指针,但在实际将类作为指针传递给方法时隐藏了它的访问权限.在C中,您将必须了解by value和by 之间的区别reference.而且,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根据你的想法而不是相反.


jal*_*alf 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.


Jer*_*fin 7

  1. 这取决于你想要学习什么.我认为最好坐下来考虑一下你为什么要真的这么做.如果Java做了你想做的事情,而你只是出于一些错位的责任感,我认为可能有更好的方法来度过你的时间.C++作为"噩梦巨头"的声誉主要是由不安全的Java程序员传播,他们试图证明在他们的心中,他们知道这是一个二流的选择1.
  2. 有几本专门为Java程序员学习C和/或C++而编写的书籍.虽然它不是专门针对Java程序员的,但如果你决定使用C++而不是C,我会考虑使用Acclerated C++.

1当然,我至少有点开玩笑,但是有几乎相当多的Java程序员似乎都有自己的筹码.如果你告诉使用Python或Ruby的人(仅举几个例子)它很慢,那么典型的反应是他们看起来有点困惑并且说:"如果你这么说 - 对我来说似乎足够快." 对于Java的建议几乎可以保证产生你明显无知并且只表达盲目仇恨的声明.

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

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


spe*_*son 5

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

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