过去5年来,我一直在专业地编写Java。最近,我不得不深入研究JNI以调用一些Windows特定功能。
这种经历凸显了我对C(或C ++)语言的不良掌握。我对C的唯一介绍是11年前我在高中读过的一本简短的“假人”一书。
我知道这两种语言在这段时间内都有所进步,尤其是C ++和标准库。
学习C或C ++对我来说是否合适?哪本书最好?
人们也对Windows编程有任何建议吗?我可以通过MSDN很好地阅读某些API调用,但我感觉我错过了关于“大图片”的事情。
由于
答案 0 :(得分:38)
好问题。从表面上看,推荐C ++是显而易见的,因为“它的面向对象就像Java”。唯一的问题是,它不是真的.C ++允许OOP,是的,但它只是C ++支持的几种范例之一。像OOP语言一样处理C ++(特别是像Java一样对待它)只会导致沮丧。
问题在于Java和C ++实际上没有多少共同之处。 Java程序员经常认为Java受C ++的启发,但只有在C ++中你才意味着最早的C ++版本,这可能更适合称为“C with classes”。 从那以后,C ++以自己的方式完全转变为自己的语言。从那以后,它可能比Java有了很大的改变。那时的Java程序员仍然能够理解今天的Java代码。对于C ++来说并非如此。所以我认为C实际上比“现代C ++”更接近Java。如果您使用Java并删除了GC以及类的概念和其他一些抽象,那么C就是您所获得的。要获得C ++,您必须添加类似数量的功能到我们假设的精简Java。
此外,C ++是一种非常复杂的语言,学习它需要很长时间。如果你不能很好地学习它,那么你将会一次又一次地用脚射击自己。
最后,这取决于你的目标。 C ++是一种比C语言更现代的语言,一旦你学会了它,就会非常富有表现力和强大,而且令人惊讶的是,它甚至可以非常优雅和简洁。但学习曲线令人讨厌。因此,对于长期的本地编程,我建议使用C ++而不是C.
但是如果您的目标主要是与Win32 API(或其他本机API)接口,那么您将不需要C ++。 Win32和大多数其他API都是用C语言编写的,而不是C ++,在任何情况下,你很可能不需要非常复杂的代码来连接它和Java。
关于学习Win32,您说得对,您需要的所有详细信息都在MSDN上。如果你想要全局,那么Petzold就是关于这个主题的 书。
答案 1 :(得分:8)
我想这取决于你的目标。
如果你想靠近机器,那么C。
如果你想补充C语言之上类似OO Java的层的知识,那么C ++。
Accelerated C ++(sanitised Amazon link)是一本很棒的书,从C ++的角度来学习C ++,而不仅仅是C,其他部分都被添加了,
K'n'R C(sanitised Amazon link)仍然是学习C恕我直言的方法!
BTW For C ++跟进Scott Meyers在Effective C ++书籍中的智慧!还有他的有效STL书。
HTH
欢呼声,
罗布
答案 2 :(得分:6)
学习足够的C ++,将其用作“更好的C”。您不必尝试将所有内容映射到您对Java的理解上。你想要的只是能够使用C ++对象作为抽象数据类型,新的和删除等等。如果STL出现在骑行中,那就更好了。
真正的问题是:为什么你认为JNI是绝对必要的? Windows调用将破坏保持您的应用程序可移植性的任何想法。我坐在一个不得不深入研究使用JNI的Java应用程序的人旁边。它会随机关闭带有SEG FAULT的服务器。他的假设是堆填满,对一个调用malloc在堆上分配空间的例程进行JNI调用。它不可用,例程不会检查返回的指针是否为null,是否释放它,然后是服务器。他仍在尝试在本地重现错误,因为它需要精确的时间来在GC启动之前调用JJNI方法。
100%确定他们是必需的吗?只是问......
答案 3 :(得分:5)
如果您对Java有很好的理解,我建议从C开始,如果直接使用C ++,它与Java之间存在很多差异,您可能会不喜欢它。
如果你认真学习这两种语言我会推荐Bjarne Stroustrup的“The C ++ Programming Language”和Dennis Ritchie的“The C Programming Language”。
答案 4 :(得分:3)
我认为 C ++比C 更容易熟练。
如果您一直在使用Java,那么您将很难摆脱类,例外,引用形式,动态绑定等方便性,当然还有体面的库。
然而,你应该首先学习C ,以确保你真正了解底层的内容并体验指针和它们的使用以及“没有防护装备”的工作感觉。
掌握了它之后,了解C ++中的继承机制以及它与Java的不同之处(例如,多重继承)。
答案 5 :(得分:2)
这实际上取决于你的优点和缺点。如果你真的喜欢设计模式,那么我建议使用C ++,但是如果你只需要在JNI中实现几个简单的方法,那么我会建议C.学习C之前C ++应该让你更好地理解内存管理而不必担心C ++的一些复杂性(构造函数调用顺序,析构函数以及C ++和Java之间的其他差异)。
我建议Kernighan和Ritchie的“C编程语言”作为学习C的权威手册。http://www.amazon.com/Programming-Language-Dennis-M-Richie/dp/0876925964
如果您使用的是* nix系统,那么有关不同功能的联机帮助页中有大量文档。例如,
bash $ man malloc
答案 6 :(得分:1)
如果你想要一个优秀的C资源,Dennis Ritchie的“The C Programming Language”就可以得到。
答案 7 :(得分:0)
如果您打算继续编写JNI代码,那么我肯定会推荐使用C ++。
特别是,JNI接口要求您获取(并随后释放)对Java对象的引用。使用C ++自动变量,您可以使用'RAII'(资源分配是初始化)技术获得这些引用,这使得内存管理变得更加简单。
答案 8 :(得分:0)
100%确定他们是必需的吗?只是 问....
不幸的是,是的。
感谢大家的回答。
要回答一些后续问题,我不是在寻找C或C ++的职业变化。我只想学习基础知识,所以当我需要编写点点滴滴时,我不觉得自己是盲目的。
答案 9 :(得分:0)
特别是JNI接口 要求你获得(和 随后发布)引用 Java对象。使用C ++自动变量 你可以使用这些参考 'RAII'(资源分配是 初始化)技术 内存管理更简单。
谢谢,这很有帮助。引起我胃部日益关注的一个领域是手动管理与JNI对象相关的内存
答案 10 :(得分:0)
如果您的“主要目标”是进行Windows编程,我建议使用C#over C或C ++。但是我相信地球上和下轨道上的每个程序员都应该知道C.不知道C ++是可以接受的,虽然你可能不会被邀请参加几个派对:)但是C在应用程序之间是一种通过的仪式(高 - 级别)程序员和库(低级)程序员。