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

相关推荐
毕设源码-朱学姐1 分钟前
【开题答辩全过程】以 办公自动化管理系统为例,包含答辩的问题和答案
java·eclipse
李宥小哥2 小时前
C#基础11-常用类
android·java·c#
小许学java3 小时前
数据结构-ArrayList与顺序表
java·数据结构·顺序表·arraylist·线性表
Java 码农5 小时前
Centos7 maven 安装
java·python·centos·maven
harmful_sheep5 小时前
maven mvn 安装自定义 jar 包
java·maven·jar
007php0075 小时前
某大厂跳动面试:计算机网络相关问题解析与总结
java·开发语言·学习·计算机网络·mysql·面试·职场和发展
JH30736 小时前
第七篇:Buffer Pool 与 InnoDB 其他组件的协作
java·数据库·mysql·oracle
皮皮林5517 小时前
订单分库分表后,商家如何高效的查询?
java
Roye_ack7 小时前
【项目实战 Day12】springboot + vue 苍穹外卖系统(Apache POI + 工作台模块 + Excel表格导出 完结)
java·spring boot·后端·excel·苍穹外卖
Code blocks9 小时前
SpringBoot自定义请求前缀
java·spring boot·后端