likes
comments
collection
share

Java 与 Go:运算符

作者站长头像
站长
· 阅读数 4

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

算数运算符

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

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

举个例子:

例一

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

  int i = 1;
  float j = 2.0f;
  double k = i + j;

在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 与 Go:运算符

而Java语言则无所谓

  float j = 2.5f;
  double k = 7.2;
  System.out.println(k % j);

  输出结果: 2.2

例三:

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

Java 与 Go:运算符

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

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

使用方式如下:

result := expression1 &^ expression2

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

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语言在使用运算符是要多加注意类型。