C for Java Programmer?

2022-09-01 14:57:08

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

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

两个问题:

  1. 我应该先尝试C还是C++ - 我意识到它们是具有一些共同点的不同语言。学习两者是否有用,或者只是尝试一个?我听说C++有点像一种语言的噩梦巨兽。

  2. 对于像我这样的Java开发人员来说,最好的资源(书籍,教程,练习程序,参考代码)是什么。

谢谢


答案 1

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

我建议通过互联网上的教程来熟悉Linux盒子上的GCC工具链。然后阅读C编程语言Linux应用程序开发的副本不会有什么坏处。此外,在Linux上,glib将使您免于重新发明轮子...但至少尝试创建自己的链表,哈希图,图形和其他API来学习。指针算术、数组和学习结构等元素只是二进制块中的命名偏移量都很重要。花时间与 和 和 记忆检查。使用C,您的工具和工具链非常重要,IDE在学习时不一定是您的朋友。mallocfree

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

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

我同意C是一门伟大的语言,它显示了一个糟糕的程序员。但请记住:

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

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


答案 2

来自ASM,C,然后C++,最后(被迫)进入Java领土,我想我可以就这个主题提供意见。

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

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

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

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

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

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

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

    1. 始终保持控制,即在没有必要时不要放置太多的间接信息
    2. 不要指点,如 ;在几个级别之后,起初似乎更容易(而不是),我更喜欢计算星星而不是“指针”[一些大cies这样做]。除了指向函数的指针,无论如何都是不可读的。typedeftypedef int *pointerToIntpointerToInt piint *pi
  • 记忆当你需要内存时,你分配它,当你不再需要它时,你释放它。容易。问题是分配适当的金额,而不是两次释放它......必须习惯这一点。并习惯堆,堆栈...当您的程序运行并寻址 NULL (0) 时,您可能会遇到明显的异常。也许不是。

  • 数据结构所以你想使用一个方便的哈希地图吗?当然,在你开发它之后。或者你可以链接一些库来做那种事情,只是选择了正确的一个。公平地说,当用C语言编程时,你[必须]以不同的方式思考,并且可能会找到比给定问题的映射更合适的算法。

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


推荐