运算符是计算机编程中最基本和常用的符号之一,它们用于执行基本的变量之间运算。在本文中,我们将深入了解 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语言在使用运算符是要多加注意类型。