10

在过去的 5 年里,我一直在专业地编写 Java。最近,我不得不深入研究 JNI 来调用一些特定于 Windows 的函数。

这段经历凸显了我对 C(或 C++)语言的糟糕掌握。我对 C 的唯一介绍是我 11 年前在高中读过的一本简短的“傻瓜”书。

我知道这两种语言在那个时间框架内都有进步,尤其是 C++ 和标准库。

我适合学习 C 或 C++ 吗?哪些书最好?

人们对 Windows 编程也有任何建议吗?我可以很好地阅读 MSDN 以找出某些 API 调用,但我感觉我错过了关于“大局”的东西。

谢谢

4

11 回答 11

37

好问题。从表面上看,推荐 C++ 是显而易见的,因为“它像 Java 一样面向对象”。唯一的问题是,这不是真的。C++ 允许 OOP,是的,但它只是 C++ 支持的几种范式之一。将 C++ 视为 OOP 语言(尤其是将其视为 Java)只会导致挫败感。

问题是 Java 和 C++ 实际上并没有太多共同点。Java 程序员通常认为 Java 是受 C++ 启发的,但只有当 C++ 指的是 C++ 的最早版本时才成立,这可能更恰当地称为“C with classes”。从那时起,C++ 完全转变为自己的语言,拥有自己的做事方式。从那时起,它的变化可能远远超过 Java。那时的 Java 程序员仍然能够理解今天的 Java 代码。对于 C++ 而言并非如此。所以我认为 C 实际上比“现代 C++”更接近 Java。如果您使用 Java 并剥离 GC 和类的概念以及其他一些抽象,那么您将得到 C。要到达 C++,

此外,C++ 是一种非常复杂的语言,学习它需要很长时间。如果你学得不好,你会一次又一次地在自己的脚上开枪。

最后,这取决于您的目标。C++ 是一种比 C 更现代的语言,一旦你学会了它,它就非常具有表现力和强大的功能,而且令人惊讶的是,它甚至可以非常优雅和简洁。但是学习曲线很糟糕。因此,从长远来看,对于本机编程,我会推荐 C++ 而不是 C。

但是,如果您的目标主要是与 Win32 API(或其他本机 API)进行交互,则不需要 C++。Win32 和大多数其他 API 是用 C 而不是 C++ 编写的,无论如何您很可能不需要非常复杂的代码来在它和 Java 之间进行接口。

关于学习Win32,你是对的,你需要的所有细节都在MSDN上。如果你想要大局观,Petzold就是关于这个主题书。

于 2009-01-21T00:31:32.580 回答
8

我想这取决于你的目标。

如果你想更接近机器,那么 C.

如果您想补充您对 C 之上的类 OO Java 层的了解,那么 C++。

Accelerated C++ ( sanitized Amazon link ) 是一本很棒的书,可以从 C++ 的角度学习 C++,而不仅仅是附加其他位的 C,

而且 K'n'R C(经过消毒的亚马逊链接)仍然是学习 C 恕我直言的方法!

BTW For C++ 跟随 Scott Meyers 在 Effective C++ 书籍中的智慧!还有他的 Effective STL 书。

高温高压

干杯,

于 2009-01-21T00:15:33.363 回答
5

学习足够多的 C++ 以将其用作“更好的 C”。您不必尝试将所有这些都映射到您对 Java 的理解上。您所需要的只是能够将 C++ 对象用作抽象数据类型、new 和 delete 等。如果 STL 顺其自然,那就更好了。

真正的问题是:为什么您认为 JNI 是绝对必要的?Windows 调用将破坏保持应用程序可移植性的任何想法。我坐在一个必须深入研究使用 JNI 的 Java 应用程序的人旁边。它会随机关闭带有 SEG FAULT 的服务器。他的假设是堆填满,对调用 malloc 的例程进行 JNI 调用以在堆上分配空间。它不可用,例程不检查返回的指针是否为空,将其释放,然后服务器关闭。他仍在尝试在本地重现错误,因为在 GC 启动之前调用 JJNI 方法需要精确的时间。

100% 确定他们是必需的?只是问问而已....

于 2009-01-21T00:52:39.090 回答
4

如果您对Java有很好的了解,我建议您从C开始,如果您直接从C++开始,它与Java之间存在很多差异,您可能会不喜欢它。

如果您认真学习这两种语言,我会推荐 Bjarne Stroustrup 的“The C++ Programming Language”和 Dennis Ritchie 的“The C Programming Language”。

于 2009-01-21T00:15:19.447 回答
3

我认为C++ 比 C 更容易让您精通

如果您一直在使用 Java,那么您将很难摆脱类、异常、引用形式、动态绑定等便利,当然还有体面的库。

但是,您应该首先学习 C以确保您真正了解引擎盖下的内容,并体验指针及其使用以及“没有防护装备”工作的感觉。

一旦掌握了这一点,就可以了解 C++ 中的继承机制以及它与 Java 的不同之处(例如,多重继承)。

于 2009-01-21T00:08:19.663 回答
2

这真的取决于你的长处和短处。如果你真的喜欢设计模式,那么我建议使用 C++,但如果你只需要在 JNI 中实现几个简单的方法,那么我会推荐 C。在 C++ 之前学习 C 应该可以让你更好地理解内存管理,而无需担心 C++ 的一些复杂性(构造函数调用顺序、析构函数以及 C++ 和 Java 之间的其他差异)。

我建议 Kernighan 和 Ritchie 的“The C Programming Language”作为学习 C 的权威手册。http://www.amazon.com/Programming-Language-Dennis-M-Richie/dp/0876925964

如果您使用的是 *nix 系统,则手册页中有大量文档可用于不同的功能。例如,

bash$ 人 malloc

于 2009-01-21T00:14:28.077 回答
1

如果你想要一个优秀的 C 资源,Dennis Ritchie 的“The C Programming Language”是一本好书。

于 2009-01-21T01:08:49.947 回答
0

如果您打算继续编写 JNI 代码,那么我肯定会推荐 C++。

特别是,JNI 接口要求您获取(并随后释放)对 Java 对象的引用。使用 C++ 自动变量,您可以使用“RAII”(资源分配即初始化)技术获取这些引用,这使得内存管理更加简单。

于 2009-01-21T00:58:29.500 回答
0

100% 确定他们是必需的?只是问问而已....

不幸的是,是的。

谢谢大家的回答。

为了回答一些后续问题,我不是在寻找 C 或 C++ 的职业转变。我只想学习基础知识,这样当我确实需要写点点滴滴时,我不会觉得自己在盲目飞行。

于 2009-01-21T01:00:10.603 回答
0

特别是,JNI 接口要求您获取(并随后释放)对 Java 对象的引用。使用 C++ 自动变量,您可以使用“RAII”(资源分配即初始化)技术获取这些引用,这使得内存管理更加简单。

谢谢,这很有帮助。引起我越来越多关注的领域之一是手动管理与 JNI 对象相关的内存

于 2009-01-21T01:06:57.347 回答
0

如果您在这里的“主要目标”是进行 Windows 编程,我会推荐 C# 而不是 C 或 C++。但是我相信地球上和低轨道上的每个程序员都应该知道 C。不知道 C++ 是可以接受的,尽管你可能不会被邀请参加一些聚会:) 但是 C 是一种仪式,在应用程序之间(高-级)程序员和库(低级)程序员。

于 2009-01-21T01:48:22.753 回答