用 C++ 和 Java 写算法,差别大吗?

本文探讨了C++和Java在实现算法时的语法差异,包括基本数据类型、字符串、基本语法、运算符和赋值、条件判断与循环、函数、数组、枚举、I/O系统以及类和封装。虽然两者有相似之处,但在一些细节上存在不同,例如C++的char类型和long类型的处理,以及Java中没有指针和全局函数。然而,对于算法实现,C++和Java之间的差别并不大,程序员可以快速理解对方语言的算法代码。
摘要由CSDN通过智能技术生成

作者:王晓华,GitChat 优秀作者

为什么会有这篇文章?

无论是七、八年前开始写的 “算法博客”,还是三年前出版的图书《算法的乐趣》,亦或是畅销课《算法应该怎么玩》,我介绍算法用的例子都是用 C++ 编写的。

尽管以前博客的留言里不乏抱怨之声,但是在《算法的乐趣》出版的时候我仍然 “一意孤行” ,最终招致读者吐槽:“好好的一本算法书,为什么要用 C++?

我的很多使用 Java 的朋友们也都为我 “打抱不平”,但是在事实面前,我不得不承认,这个拖了很久的需求必须要实现了。

尽管学习 Java 了很长时间,但是因为工作的需要,很少用 Java 做过大型的项目,所以在公开算法实现的时候,我本能地选择最擅长的 C++ 语言。

事实上,我在编写《算法应该怎么玩》的过程中,参考资料里有不少 Java、Python 实现的算法,原理都是相通的,用何种编程语言实现只是对外展示的一张皮而已。

作为一个 Java 程序员时,经常会遇到 C++ 算法代码,有时候没有更好的替代例子的情况下,还必须得啃一啃 C++。

往好处想,虽然 C++ 涉及的内容广泛,但是算法上能用到的部分并不多,都是一些基本语言元素,短时间内了解一下 C++ 相关的内容,能够看懂小段的 C++ 代码是完全有可能的。

接下来,我会在算法涉及的层面上,比较一下 C++ 和 Java 上的差异,通过这些对比和比较,Java 程序员能快速理解 C++ 算法实现的例子,C++ 程序员也能看懂简单的 Java 算法代码。

PS:

两种语言的对比会放在一起展示,如不做特殊说明,上面的代码是 C++ 的实现方式,下面的是 Java 的实现方式。

此外,C++ 语法层面使用的版本是 C++11之后的版本,Java 使用的标准是 Java6 之后的版本。

C++ 和 Java 语法特性的相似性

因为历史原因,同为 C 语言家族的 Java 和 C++ 语言层面的相似性是有客观基础的。

我通常是这样理解的:Java 是跨平台的 C++,是一种更好的 C++(是不是有点拉仇恨的感觉)。

基本数据类型

C++ 的基本数据类型有:int、unsigned int、long、unsigned long、short、unsigned short、char、unsigned char、bool、float 和 double;

相应的,Java 也有 8 种基本数据类型,分别是:byte、short、int、long、float、double、char 和 boolean。

大部分情况下,两种语言的基本数据类型可以根据下表进行一对一的转换,但是也有差异,需要特别注意。

首先是 char,C++ 的 char 是 8 比特无符号整数,顺便表示了 ASCII 字符;Java 的 char 是 16 比特,天生就可以表示宽字符集的字符。

另一个需要注意的是 long 类型,C++ 的 long 是不可移植类型,在不同的系统上其长度不一样,可能是 32 位,也可能是 64 位,所以 C++ 程序员应尽量避免使用 long。

Java 的 long 比较单纯,无论是 32 位的系统还是 64 位的系统,它都表示 64 位整数。
在这里插入图片描述

反过来,Java 会用 d 或 D 表示一个直接数字是 double 类型的浮点数,比如 200.0d 或(200.0D),但是 C++ 不支持,因为 C++ 默认一个浮点型的直接数字就是 double 类型。

C++ 用字面量符号 f 或 F 表示一个直接数字是 float 类型浮点数,比如 250.1 f(或 250.1F),这一点 Java 也是一样的。

C++ 用字面量符号 l 或 L 表示 long,用 UL 表示 unsigned long。

字符串

很多 C++ 程序员喜欢的用 char* 或 char 类型的数组存储字符串,这其实是 C 语言用户带过来的习惯,我给出的 C++ 算法实现对字符串一般都用 std::string',对应 Java 的 String。

std::stringString 的用法对照如下表所示:
在这里插入图片描述

基本语法

虽然 Java 的语法和 C++ 十分地相似,但是语言层面还有一些不同。C++ 允许全局函数的存在,但是 Java 不允许,不过 Java 也留了个口子,就是用静态成员函数。

Java 没有指针,对象的传递和返回都是用的引用的方式,并且不需要像 C++ 那样用 “&a

  • 54
    点赞
  • 148
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值