作为一名专业(Java)程序员和沉重的Linux用户,我觉得学习一些C是我的责任(尽管我可能从不专业地使用它),只是为了让我成为更好的程序员。
两个问题:
我应该先尝试使用C或C ++ - 我发现它们是不同的语言,有一些共同点。学习两者,或者只尝试一个是有用的吗?我听说C ++是一种语言的噩梦。
像我这样的Java开发人员有哪些最好的资源(书籍,教程,练习程序,参考代码)。
由于
答案 0 :(得分:28)
C学习简单,难以掌握。作为Java程序员,屏障将是内存和结构 ..并且撤消Java 可能已经对生成大脑部分的算法所造成的损害;)
我建议您通过Internet上的教程熟悉Linux机箱上的GCC工具链。然后阅读The C Programming Language,Linux Application Development的副本不会受到影响。此外,在Linux glib上将免于重新发明轮子...但至少尝试创建自己的链表,哈希图,图表和其他API来学习。指针算术,数组和学习元素(如结构体)只是二进制块中的命名偏移量都很重要。花时间与malloc
和free
以及memcheck。使用C,您的工具和工具链非常重要,IDE在学习时不一定是您的朋友。
我会选择C over C ++,因为C是习惯C的内存管理和指针使用的良好基础。
您可以做的最好的事情是应用您对实际项目学到的知识。但是要准备好在Valgrind和GDB中分配你的头。我已经编程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,用于更多的理论原则和严格的结构规则可能
所以,现在,我的任务是帮助您在学习C / C ++之前感到安全,自信和积极性!
我的建议是从C开始,因为
我在C研究期间要强调的是,例如
指针 Java当然使用指针,但在实际将类作为指针传递给方法时隐藏了它的访问权限。在C中,您必须了解value
和reference
之间的区别。此外,char x[3]
和char *x = "ab"
之间的细微差别。指针是如何方便通过数组等...,你知道*++x
或*x++
。关于指针的说法很多,我的建议是
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程序员似乎都有自己的筹码。如果你告诉使用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更强。这是一件好事。
答案 6 :(得分:2)
C ++可能比C更熟悉,并且可能更容易实现高效率。但是,C语言要小得多,而且学习起来应该相当简单(尽管要小心;通过学习C,你会有永久性脑损伤的风险)。我的个人参考是Harbison& Sons的“C:A Reference Manual”。斯蒂尔(现为第5版)。对于C ++,我只使用O'Reilly的坚果壳书。
作为一名具有一定C ++经验且目前正在向Java过渡的C程序员,我可以告诉你关于C的事情可能会让你几乎立刻绊倒你:
malloc()
或calloc()
)你都可以解除分配(通过free()
)。 gets()
和scanf()
)使缓冲区溢出漏洞成为真正的风险。int *(*(*(*f)())[10])();
之类的声明是可能的(f是指向函数的指针,该函数返回指向返回指向int`的函数的10元素指针数组的指针。short
,int
和long
等类型的最小范围,但它们可能比最低要求更宽。如果您期望int
无论平台如何都始终保持相同的大小,那么您可能会遇到一些惊喜。