Java 与 Go:运算符

运算符是计算机编程中最基本和常用的符号之一,它们用于执行基本的变量之间运算。在本文中,我们将深入了解 Java 和 Go 语言中的各种运算符,并比较它们之间的异同点。

算数运算符

算数运算符是编程语言中用于执行基本数学运算的符号或关键字。它们允许对数字执行各种数学操作,如加法、减法、乘法、除法等。在算数的设计上,各种编程语言大同小异。

算数运算符 解释 注意事项
+ 两数相加 在Go语言中,两数相加的前提是两数必须类型一致,这是和Java最大的区别。 请看例一
- 两数相减 同上
* 两数相乘 同上
/ 两数相除 同上
% 前者对后者取余 请看例二
++ 自增 只作用于整数,且看例三
-- 自减 同上

举个例子:

例一

在Java中,不同类型的数字可以运算,只要接收返回值的变量类型范围够宽,Java都会自动转换

ini 复制代码
  int i = 1;
  float j = 2.0f;
  double k = i + j;

在Go中,不同类型的数字要先类型转换,否则会报错

go 复制代码
  var num1 float32 = 128.2
  var num2 float64 = 128.2

  fmt.Println(num2/float64(num1))

例二:

在Go语言中,取模运算符(%)只能用于整数类型的操作数,而不能用于浮点数类型。因此,如果您尝试对浮点数执行取模运算,编译器会报错,提示类似于 "invalid operation: operator % not defined on num2 (variable of type float64)" 的错误信息。

而Java语言则无所谓

ini 复制代码
  float j = 2.5f;
  double k = 7.2;
  System.out.println(k % j);

  输出结果: 2.2

例三:

在Go中,++只能作为后置操作符使用。并且该语句并没有返回值,所以不可以用变量接受

而Java语言则更像是他们的老父亲C语言那样,还衍生出八股文章经典的++i和i++问题

ini 复制代码
  int i = 5;
  int result = i++; // result = 5, i = 6

  int i = 5;
  int result = ++i; // result = 6, i = 6

关系运算符

关系运算符 解释
== 两数是否相等
>= 左是否大于或等于右
<= 右是否大于或等于左
!= 两数是否不相等
左是否大于右
< 右是否大于左

用法上二者一致,Go语言要额外注意两边的类型要一模一样。

这里说句题外话,大家要记住在计算机的世界里,2.0-1.9可不等于1.9-1.8,用==对比得到的是false。

逻辑运算符

逻辑运算符 解释
&& 一假则假
|| 一真则真
真变假,假变真

这里没什么好说的,貌似所有的编程语言在逻辑运算这里都很一致。

位运算符

这块相当重量级,在leetcode上有专门的一个位运算专题

关系运算符 解释
& 二进制各位相与,全1为1
| 二进制各位相或,有1为1
| 二进制各位异或,0-1或1-0为1
<< 左移,相当于乘2,左移n位就是乘以2的n次方倍
>> 右移,相当于除2,右移n位就是除以2的n次方倍

到此为止,Java和Go的位运算一模一样。但是Go语言新增了一个 &^

在Go语言中,&^ 是按位清除操作符,也称为位清除操作符。它用于清除某些位上的值,可以通过与另一个数进行按位与操作来实现。

使用方式如下:

go 复制代码
result := expression1 &^ expression2

&^ 按位清除操作符的行为是这样的:对于每一个位,如果第二个操作数(expression2)的对应位是1,那么结果中的该位就会被清零,否则结果中的该位就保持和第一个操作数(expression1)中的对应位一样。

less 复制代码
package main

import "fmt"

func main() {
    var a uint8 = 0b10101100 // 二进制表示为 10101100
    var b uint8 = 0b11001010 // 二进制表示为 11001010

    result := a &^ b

    fmt.Printf("Result: %08b\n", result) // 输出结果的二进制表示
}

a 的二进制表示为 10101100,
b 的二进制表示为 11001010。
&^ 按位清除操作符会根据 b 中的值,将 a 中对应位的值进行清除。
第一二位 b的值是1 所以 返回00
第三四位 b的值是0 所以保持a的值返回10
之后同样的道理
运行以上代码,输出为 Result: 00100100,

其他运算符

关系运算符 解释
& 放在变量前面就是取地址
* 放在变量前面就是访问该变量所指向的内存

这两个运算符Java没有,学过C的同学肯定熟悉。

总结

虽然Java和Go在运算符设计上有许多相似之处,但在细节和语言特性上仍有一些不同。Go语言在使用运算符是要多加注意类型。

相关推荐
以后不吃煲仔饭9 分钟前
Java基础夯实——2.7 线程上下文切换
java·开发语言
进阶的架构师10 分钟前
2024年Java面试题及答案整理(1000+面试题附答案解析)
java·开发语言
The_Ticker15 分钟前
CFD平台如何接入实时行情源
java·大数据·数据库·人工智能·算法·区块链·软件工程
大数据编程之光37 分钟前
Flink Standalone集群模式安装部署全攻略
java·大数据·开发语言·面试·flink
爪哇学长1 小时前
双指针算法详解:原理、应用场景及代码示例
java·数据结构·算法
ExiFengs1 小时前
实际项目Java1.8流处理, Optional常见用法
java·开发语言·spring
paj1234567891 小时前
JDK1.8新增特性
java·开发语言
繁依Fanyi1 小时前
简易安卓句分器实现
java·服务器·开发语言·算法·eclipse
煎鱼eddycjy1 小时前
新提案:由迭代器启发的 Go 错误函数处理
go
慧都小妮子1 小时前
Spire.PDF for .NET【页面设置】演示:打开 PDF 时自动显示书签或缩略图
java·pdf·.net