可能是重复问题:
我应该先学习C还是C++?
作为一名专业的(Java)程序员和 Linux 用户,我觉得学习一些 C 是我的责任(即使我可能永远不会在职业上使用它),这样可以让我成为一个更好的编程人员。
两个问题:
我应该先尝试 C 还是 C++ - 我意识到它们是不同的语言,但有一些共同点。学习一点 C++ 是否有用,还是只尝试其中一种?我听说 C++ 是一个庞大的噩梦语言。
对于像我这样的 Java 开发者,最好的资源是什么(书籍、教程、实践程序、参考代码)?
谢谢
可能是重复问题:
我应该先学习C还是C++?
作为一名专业的(Java)程序员和 Linux 用户,我觉得学习一些 C 是我的责任(即使我可能永远不会在职业上使用它),这样可以让我成为一个更好的编程人员。
两个问题:
我应该先尝试 C 还是 C++ - 我意识到它们是不同的语言,但有一些共同点。学习一点 C++ 是否有用,还是只尝试其中一种?我听说 C++ 是一个庞大的噩梦语言。
对于像我这样的 Java 开发者,最好的资源是什么(书籍、教程、实践程序、参考代码)?
谢谢
C语言简单易学,但是掌握难度很大。如果你是一名Java程序员,那么内存和结构将是阻碍。而且还需要消除Java对你的大脑算法产生的影响 ;)
我建议你通过互联网上的教程,熟悉Linux下的GCC工具链。然后阅读《C程序设计语言》,并且可以看一下《Linux应用开发》。在Linux上,glib可以帮助你避免重复造轮子...但至少要尝试创建自己的链表、哈希表、图形和其他API来学习。指针运算、数组以及了解结构体等元素只是二进制块中的命名偏移量都非常重要。花时间使用malloc
、free
和memcheck。在学习时,你的工具和工具链非常重要,IDE不一定是你的朋友。
相比C++,我会选择C作为基础语言,因为它可以让你逐步习惯于C的内存管理和指针用法。
你可以通过将所学应用到实际项目中来获得最好的学习效果。但是要准备在Valgrind和GDB中花费很多时间。我已经使用C语言编程多年,但仍然不是一名C语言高手。
我同意C语言是一门伟大的语言,它可以揭示出糟糕的程序员。但请记住:
任何足够复杂的C程序都包含一个特定的、非正式的、错误丛生的、速度缓慢的Common Lisp的一半实现。
这个故事的寓意是学习其他编程语言,而不仅仅是C语言的衍生语言!考虑一些Lisp方言、Erlang(目前很流行)和Haskell等。它们将会拓展你的视野,让你走出Java的2x2单元格。同时,建议看看SICP。
After getting a solid foundation in C, learning C++ becomes much easier because it builds on top of C and provides additional object-oriented programming features.
In conclusion, while transitioning from Java to C/C++ may be challenging, starting with C can help build a strong foundation for understanding the lower-level aspects of programming and make the transition smoother.
指针 Java 当然使用指针,但在传递类时隐藏了其访问。在 C 中,你将需要学习按值和按引用的区别。还有更微妙的区别,如 char x[3] 和 char *x = "ab"。以及通过指针方便地遍历数组等等,您知道*++x 或 *x++。关于指针已经说了很多,我的建议是:
内存 当您需要内存时,分配它,当您不再需要它时,释放它。简单。问题在于分配正确的数量,并且不要多次释放它... 必须习惯。并且要习惯堆栈... 当您的程序运行并且地址为 NULL (0) 时,您可能会看到一个异常。也可能没有。
数据结构 所以你想使用方便的 HashMap?当然,在你开发它之后。或者有一些库可以链接并完成这种事情,只需选择正确的一个。公平地说,当在 C 中编程时,您 [必须] 思考不同,并且可能会找到比地图更适合某个问题的更合适的算法。
总的来说,起初您会感到迷失方向,但最终(除非您做噩梦)您会找到很多有趣和愉悦的空间。 C 允许一个人完全自由地编程:C 按照你的思想行动,而不是相反。
如果目标是成为更好的程序员,请选择那些真正尝试区别于其他语言的编程语言。Java、C++和C都紧密相关。
确实,其中一种是主要的过程式语言,另一种则努力伪装成面向对象,还有一种则混合了至少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。
既然你是为了自我实现和学习,我建议你可以尝试一下C++。
在我详细解释之前,先简单说一下我的背景:我以前主要使用C++进行工作,并且从未处理过任何规模的C代码。现在我主要使用C#,只在极少数情况下使用C ++。
我认为选择C ++ 是更好的选择,因为:
归根结底:学到的越多,你就能学到更多。而C ++会强迫你学习很多东西,肯定比C多。这是一件好事。
C++相对于C来说可能更加熟悉,也更容易上手。但是,C语言更小巧,学习起来应该相对简单(不过要注意,学习C语言可能会导致永久性的脑损伤)。我个人推荐使用Harbison & Steele的《C: A Reference Manual》(目前为第五版)作为C语言参考书。对于C++,我只使用O'Reilly nutshell book。
作为一名有一些C++经验并正在转向Java的C程序员,我可以告诉你,关于C语言,以下几点可能会让你立刻陷入困境:
malloc()
或calloc()
动态分配的字节都需要你负责释放(通过free()
)。 gets()
和scanf()
)会导致缓冲区溢出漏洞成为真正的风险。int *(*(*f)())[10])();
这样丑陋的声明,但类似于f是指向返回指针的10元素数组的函数指针这样的声明是可能的。 short
、int
和long
等类型的最小范围,但它们可能比最小要求更宽。如果你期望一个int
在任何平台上都具有相同的大小,那么你会有些惊讶。