首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C为Java程序员?

C为Java程序员?
EN

Stack Overflow用户
提问于 2010-08-21 18:39:39
回答 6查看 8.1K关注 0票数 27

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

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

两个问题:

  1. 我应该先试试C还是C++ --我意识到它们是不同的语言,有一些共同点。这是有用的学习两者的一点,还是只尝试一个?我听说C++有点像一种语言的梦魇。
  2. 对于像我这样的Java开发人员来说,什么是最好的资源(书籍、教程、实践程序、参考代码)。

谢谢

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-08-21 18:44:27

C简单易学,不易掌握。作为一名Java程序员,其障碍将是内存和结构。消除Java可能对生成大脑部分的算法造成的损害;)

我建议通过互联网上的教程,熟悉Linux机顶盒上的GCC工具链。然后读一读C语言Linux应用程序开发的副本就不会受伤。而且,在Linux 滑翔上可以避免你重新发明方向盘.但至少要尝试创建自己的链接列表、hashmap、图形和其他API来学习。指针算法、数组和学习元素(如structs )只是命名--二进制块中的偏移量都很重要。花点时间在mallocfree上,再花点时间给你看。使用C,您的工具和工具链非常重要,IDE在学习时不一定是您的朋友。

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

你能做的最好的事情就是把你学到的东西应用到一个真正的项目中。但要做好准备,在瓦兰GDB中将你的头撞在墙上。我已经编程C很多年了,我仍然不是C和尚。

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

任何足够复杂的C程序都包含一个临时的、非正式指定的、充满错误的、缓慢实现公共Lisp一半的程序。

它的寓意也是学习其他语言,而不仅仅是C派生语言!考虑一些Lisp方言、Erlang (目前很酷)、Haskell等,它们将从Java的2x2单元格扩展您的视野。也可以考虑看看SICP

票数 33
EN

Stack Overflow用户

发布于 2010-08-21 21:42:24

我来自ASM,C,然后是C++,最后降落(被迫)到爪哇领域,我想我可以提供一个关于这个问题的意见。

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

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

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

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

  • C本身就拥有所有你从来不用面对的Java概念
  • 作为一名Java程序员,您已经有了一个类的“方法”,从C++开始,您可能会倾向于坚持Java原则
  • C原则仅限于少数原则。在进入汇编语言的黑暗世界之前,C看起来是最后一个人类的东西。

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

  • 指针当然使用指针,但是在将类作为指针传递给方法时隐藏它的访问。在C语言中,您必须了解valuereference之间的区别。另外,char x[3]char *x = "ab"之间的差别也比较微妙。以及如何方便指针通过数组等.,您知道*++x*x++。关于指针已经说了很多,我的建议是
代码语言:javascript
运行
复制
1. always keep control, i.e. don't put too many indirections when not necessary
2. don't `typedef` pointers, like `typedef int *pointerToInt` ; it seems easier at first (`pointerToInt pi` instead of `int *pi`) after a few levels, I prefer to count the stars than the 'pointerTo' [some big cies do that]. Except maybe the pointers to functions, unreadable anyway.

  • 内存当您需要内存时,您分配它,当您不再需要它时,您释放它。很简单。问题是分配正确的数量,而不是两次释放.一定要习惯这点。习惯堆,堆.当您的程序运行和地址为NULL (0)时,您可能有一个可见的异常。也许不是。
  • 数据结构所以您想使用方便的HashMap吗?当然,在你开发出来之后。或者有一些库,你可以链接,做这种事情,只是选择一个正确的。公平地说,在用C编写程序时,您必须考虑不同的问题,并且可能会为给定的问题找到比映射更合适的算法。

总之,一开始你会感到迷失方向,但最终(除非你做噩梦)你会在你面前找到很多空间来娱乐和娱乐。C允许一个人完全自由地编程:C按照你的想法去做,而不是相反。

票数 27
EN

Stack Overflow用户

发布于 2010-08-21 21:17:21

如果你的目标是让你成为一个更好的程序员,那就瞄准那些真正想要与众不同的语言。Java、C++和C都是密切相关的。

的确,一个主要是一种过程语言,一个人非常努力地假装自己是面向对象的,一个是至少四个不同范例的组合,但它们都是命令式语言,它们都有很多语法,基本上,它们都是同一个语言家族的一部分。

学习C并不能教会你任何戏剧性的新东西。它可能会教您一些关于内存布局之类的知识,但您可以从许多其他方面了解到这一点,而且它与Java程序员没有太大关系。

另一方面,该语言相对容易掌握,并广泛应用于许多Linux软件,因此,如果您想为其中的任何一项贡献,学习C是一个好主意。它不会让你成为一个更好的Java程序员。

至于C++,称它为“语言的恶梦庞然大物”可能离事实不远。它又大又复杂,对粗心的初学者来说充满了陷阱和陷阱。

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

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

同样,作为一个Java程序员,学习C++对你不会有太大的影响,只是它会暴露出一些你直到现在还没有意识到的缺点。

学习这两种语言都是好的,但更好的是学习一些不同的东西。

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

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

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3538477

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档