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

相关推荐
xlsw_1 小时前
java全栈day20--Web后端实战(Mybatis基础2)
java·开发语言·mybatis
神仙别闹2 小时前
基于java的改良版超级玛丽小游戏
java
黄油饼卷咖喱鸡就味增汤拌孜然羊肉炒饭2 小时前
SpringBoot如何实现缓存预热?
java·spring boot·spring·缓存·程序员
暮湫2 小时前
泛型(2)
java
超爱吃士力架3 小时前
邀请逻辑
java·linux·后端
南宫生3 小时前
力扣-图论-17【算法学习day.67】
java·学习·算法·leetcode·图论
转码的小石3 小时前
12/21java基础
java
李小白663 小时前
Spring MVC(上)
java·spring·mvc
GoodStudyAndDayDayUp3 小时前
IDEA能够从mapper跳转到xml的插件
xml·java·intellij-idea
装不满的克莱因瓶4 小时前
【Redis经典面试题六】Redis的持久化机制是怎样的?
java·数据库·redis·持久化·aof·rdb