【JAVASE】运算符
⭐ 作者:小胡_不糊涂
🌱 作者主页:小胡_不糊涂的个人主页
📀 收录专栏:浅谈Java
💖 持续更文,关注博主少走弯路,谢谢大家支持 💖
运算符
- 1. 什么是运算符
- 2. 算术运算符
- 3. 关系运算符
- 4. 逻辑运算符
- 5. 位运算符
- 6. 移位运算符
- 7. 条件运算符
- 8. 运算符的优先级
1. 什么是运算符
计算机的最基本的用途之一就是执行数学运算,比如:
int a = 10;
int b = 20;
a + b;
a < b;
上述 + 和 < 等就是运算符,即:对操作数进行操作时的符号,不同运算符操作的含义不同。
作为一门计算机语言,Java也提供了一套丰富的运算符来操纵变量。Java中运算符可分为以下:算术运算符**(+ - * /)、关系运算符(< > ==)**、逻辑运算符、位运算符、移位运算符以及条件运算符等。
2. 算术运算符
1. 基本四则运算符:加减乘除模(+ - * / %)
int a = 20;
int b = 10;
System.out.println(a + b);
System.out.println(a - b);
System.out.println(a * b);
System.out.println(a / b);
System.out.println(a % b); // % 模运算相当于数学中除法的余数
运行结果:

注:
- 上述都是二元运算符,使用时必须要有左右两个操作数
int / int 结果还是int类型,而且会向下取整
请看这段代码:
int a = 3;
int b = 2;
System.out.println(a / b);
运行结果:

有些人可能会好奇,3/2 应该是 1.5 ,这里的输出结果为什么是 1 ,这是因为 int / int 结果还是int类型,而且会向下取整,即小数点之后全部舍弃掉了。
如果要得到 1.5 ,应该这样修改:

在做除法和取模时,右操作数不能为0
例如:
int a = 1;
int b = 0;
System.out.println(a / b)
运行结果:

% 不仅可以对整型取模,也可以对double类型取模,但是没有意义,一般都是对整型取模的
System.out.println(11.5 % 2.0)

我们已经知道这些运算符的运算规则了,看看下面计算,你能做对吗?
System.out.println(5/2);
System.out.println((float)5/2);
System.out.println(5/(float)2);
System.out.println((float)(5/2));System.out.println(10%3);
System.out.println(-10%3);
System.out.println(10%-3);
System.out.println(-10%-3);
答案 ↓ :

当两侧操作数类型不一致时,会向类型大的提升
System.out.println(1+0.2);
这里 + 的左侧是 int ,右侧是 double ,在加之前 int 会被提升为 double ,所以输出结果是 1.2
*2. 增量运算符 += -= = %=
该种类型运算符操作完成后,会将操纵的结果赋值给左操作数。
int a = 1;
a += 2; // 相当于 a = a + 2
System.out.println(a); // 输出3a -= 1; // 相当于 a = a - 1
System.out.println(a); // 输出2a *= 3; // 相当于 a = a * 3
System.out.println(a); // 输出6a /= 3; // 相当于 a = a / 3
System.out.println(a); // 输出2a %= 3; // 相当于 a = a % 2
System.out.println(a); // 输出2
只有变量才能使用该运算符,常量不能使用。
3. 自增/自减运算符 ++ –
++是给变量的值+1,–是给变量的值-1。
int a = 1;
a++; // 后置++ 表示给a的值加1,此时a的值为2
System.out.println(a++); // 注意:后置++是先使用变量原来值,表示式结束时给变量+1,因此输出2
System.out.println(a); // 输出3++a; // 前置++ 表示给a的值加1
System.out.println(++a); // 注意:前置++是先给变量+1,然后使用变量中的值,因此输出5
System.out.println(a); // 输出5// -- 操作符给操作-1,与++含义类似

注:
- 如果单独使用,【前置++】和【后置++】没有任何区别
- 如果混合使用,【前置++】先+1,然后使用变量+1之后的值,【后置++】先使用变量原来的值,表达式结束时给变量+1
- 只有变量才能使用自增/自减运算符,常量不能使用,因为常量不允许被修改
3. 关系运算符
关系运算符主要有六个: == != < > <= >= ,其计算结果是 true 或者 false 。
例如:
int a = 10;
int b = 20;
// 注意:在Java中 = 表示赋值,要与数学中的含义区分
// 在Java中 == 表示相等
System.out.println(a == b);
System.out.println(a != b);
System.out.println(a < b);
System.out.println(a > b);
System.out.println(a <= b);
System.out.println(a >= b);
运行结果:

注:
当需要多次判断时,不能连着写,比如:3 < a < 5,需要用到下面的逻辑运算符 3<a && a<5
4. 逻辑运算符
逻辑运算符主要有三个: && || ! ,运算结果都是 boolean 类型(false 或 true)。
1. 逻辑与 &&
语法规则:表达式1 && 表达式2,左右表达式必须是 boolean 类型的结果。
两个表达式都为真,结果才是真,只要有一个是假,结果就是假。
| 表达式 1 | 表达式 2 | 结果 |
|---|---|---|
| 真 | 真 | 真 |
| 真 | 假 | 假 |
| 假 | 真 | 假 |
| 假 | 假 | 假 |
例如:
int a = 1;
int b = 2;
System.out.println(a == 1 && b == 2); // 左为真 且 右为真 则结果为真
System.out.println(a == 1 && b > 100); // 左为真 但 右为假 则结果为假
System.out.println(a > 100 && b == 2); // 左为假 但 右为真 则结果为假
System.out.println(a > 100 && b > 100); // 左为假 且 右为假 则结果为假
运行结果:

2. 逻辑 ||
语法规则:表达式1 || 表达式2,左右表达式必须是 boolean 类型的结果。
左右表达式至少有一个位真,则结果为真。
| 表达式 1 | 表达式 2 | 结果 |
|---|---|---|
| 真 | 真 | 真 |
| 真 | 假 | 真 |
| 假 | 真 | 真 |
| 假 | 假 | 假 |
例如:
int a = 1;
int b = 2;
System.out.println(a == 1 || b == 2); // 左为真 且 右为真 则结果为真
System.out.println(a == 1 || b > 100); // 左为真 但 右为假 则结果也为真
System.out.println(a > 100 || b == 2); // 左为假 但 右为真 则结果也为真
System.out.println(a > 100 || b > 100); // 左为假 且 右为假 则结果为假
运行结果:

3. 逻辑非 !
语法规则:! 表达式
真变假,假变真
| 表达式 1 | 结果 |
|---|---|
| 真 | 假 |
| 假 | 真 |
例如:
int a = 1;
System.out.println(!(a == 1)); // a == 1 为true,取个非就是false
System.out.println(!(a != 1)); // a != 1 为false,取个非就是true
运行结果:

4. 短路求值
&& 和 || 遵守短路求值的规则。
例如:
System.out.println(10>20 && 10/0==0); //打印false
System.out.println(10<20 || 10/0==0); //打印true
我们都知道,计算 10 / 0 会导致程序抛出异常,但是上面的代码却能正常运行,说明 10 / 0 并没有真正被求值,只判断了 10<20。
注:
- 对于 && ,如果左侧表达式值为 false,则表达式结果一定是 false,无需计算右侧表达式。
- 对于 ||,如果左侧表达式值为 true,则表达式结果一定是 true,无需计算右侧表达式。
- & 和 | 如果表达式结果为 boolean 时,也表示逻辑运算。但与 && || 相比,它们不支持短路求值。
5. 位运算符
Java 中数据存储的最小单位是字节,而数据操作的最小单位是比特位,字节是最小的存储单位,每个字节是由8个二进制比特位组成的,多个字节组合在一起可以表示各种不同的数据。
位运算符主要有四个: & | ~ ^ ,除 ~ 是一元运算符外,其余都是二元运算符。
位操作表示按二进制位运算,计算机中都是使用二进制来表示数据的( 0 1 构成的序列),按位运算就是在按照二进制位的每一位依次进行计算。
1. 按位与 &:如果两个二进制位都是 1,则结果为 1,否则结果为 0
例如:
int a = 10;
int b = 20;
System.out.println(a & b);
进行按位运算,要先把 10 和 20 转成二进制,分别为 1010 和 10100,计算过程如下图:

2. 按位或 |:如果两个二进制位都是 0,则结果为 0,否则结果为 1
运算方式和按位与类似,如下图所示:

注:
- 当 & 和 | 的操作数为整数(int, short, long, byte) 的时候,表示按位运算
- 当操作数为 boolean 的时候,表示逻辑运算
3. 按位取反 ~:如果该位为 0 则转为 1, 如果该位为 1 则转为 0
例如:
int a = 0xf;
System.out.printf("%x\n", ~a)
图解:int 型占 4 字节,1 字节 = 8 比特位,总共 32 个比特位

运行结果:

注:
- 0x 前缀的数字为 十六进制 数字,十六进制 可以看成是 二进制 的简化表示方式。一个十六进制数字对应 4个二进制位。
- 0xf 表示 10 进制的 15,也就是二进制的 1111。
- printf 能够格式化输出内容,%x 表示按照十六进制输出。
- \n 表示换行符。
4. 按位异或 ^:如果两个数字的二进制位相同,则结果为 0,相异则结果为 1
例如:
int a = 0x1;
int b = 0x2;
System.out.printf("%x\n", a ^ b);
图解:

运行结果:

6. 移位运算符
移位运算符有三个: << >> >>> ,都是二元运算符,且都是按照二进制比特位来运算的。
**1. 左移 <<:最左侧位不要了,最右侧补 0 **
例如:
int a = 0x10;
System.out.printf("%x\n", a << 1);
// 运行结果按十六进制打印
图解:

运行结果:

向左移位时,丢弃的是符号位,因此正数左移可能会编程负数
2. 右移 >>:最右侧位不要了,最左侧补符号位(正数补 0,负数补 1)
例如:
int a = 0x10;
System.out.printf("%x\n", a >> 1);
// 运行结果按十六进制打印
图解:

运行结果:

3. 无符号右移 >>>:最右侧位不要了,最左侧补 0
int a = 0xffffffff;
System.out.printf("%x\n", a >>> 1);
运行结果:

注:
- 左移 1 位,相当于原数字 * 2. 左移 N 位,相当于原数字 * 2 的N次方
- 右移 1 位,相当于原数字 / 2. 右移 N 位,相当于原数字 / 2 的N次方
- 由于计算机计算移位效率高于计算乘除,当某个代码正好乘除 2 的N次方的时候可以用移位运算代替
- 移动负数位或者移位位数过大都没有意义
7. 条件运算符
条件运算符只有一个:
表达式1 ? 表达式2 : 表达式3
- 当 表达式1 的值为 true 时,整个表达式的值为 表达式2 的值
- 当 表达式1 的值为 false 时,整个表达式的值为 表达式3 的值
- 也是 Java 中唯一的一个 三目运算符,是条件判断语句的简化写法
例如:求两个整数的最大值
int a = 10;
int b = 20;
int max = a > b ? a : b;
System.out.println(max);
运行结果:

注:
- 表达式2和表达式3的结果要是同类型的,除非能发生类型隐式类型转换
- 表达式不能单独存在,其产生的结果必须要被使用
int a = 10;
int b = 20;
a > b? a : b; // 报错:Error:(15, 14) java: 不是语句
8. 运算符的优先级
在一条表达式中,各个运算符可以混合起来进行运算,但是运算符的优先级不同,比如:* 和 / 的优先级要高于 +和 - 。
观察下段代码是否正确:
// 求a和b的平均值
int a = 10;
int b = 20;
int c = a + (b - a) >> 1;//右移一位相当于 /2
System.out.println(c);
运行结果:

为什么结果和我们想的不一样?
这是因为在上述表达式中,由于 + 的优先级要高于 >> ,因此 a 先和 b-a 的结果做加法,整体为20,最后再进行右移,因此结果为 10 。
为了不被优先级干扰,我们可以在恰当的位置加上括号:
int a = 10;
int b = 20;
int c = a +( (b - a) >> 1 );//右移一位相当于 /2
System.out.println(c);
运行结果:


相关文章:
【JAVASE】运算符
⭐ 作者:小胡_不糊涂 🌱 作者主页:小胡_不糊涂的个人主页 📀 收录专栏:浅谈Java 💖 持续更文,关注博主少走弯路,谢谢大家支持 💖 运算符 1. 什么是运算符2. 算术运算符3.…...
Emacs之改造搜索文件fd-dired(基于fd命令)(一百二十一)
简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…...
字典序排数(力扣)思维 JAVA
给你一个整数 n ,按字典序返回范围 [1, n] 内所有整数。 你必须设计一个时间复杂度为 O(n) 且使用 O(1) 额外空间的算法。 示例 1: 输入:n 13 输出:[1,10,11,12,13,2,3,4,5,6,7,8,9] 示例 2: 输入:n 2 输…...
NLP 中的pad/padding操作代码分析
今天分析一下NLP中的pad操作代码: 该方法的作用是将输入的序列列表seqs进行填充操作,使其具有相同的长度,以便进行批处理。填充使用指定的pad_token进行,并生成一个对应的mask标志列表,用于标记哪些部分是填充内容&am…...
JavaWeb 速通HTTP
目录 一、HTTP快速入门 1.HTTP简介 : 2.HTTP请求头 : 3.HTTP响应头 : 二、HTTP响应状态码 1.基本介绍 : 2.常见状态码 : 3.状态码的分类 : 4.完整状态码汇总 : 三、HTTP请求包和响应包 1.请求包分析 : 1 GET请求 (1) 说明 (2) doGet返回数据给浏览器 (3) form表单提…...
Vue 本地应用 图片切换 v-show v-bind实践
点击切换图片的本质,其实修改的是img标签的src属性。 图片的地址有很多个,在js当中通过数组来保存多个数据,数组的取值结合索引,根据索引可以来判断是否是第一张还是最后一张。 图片的变化本质是src属性被修改了,属性…...
AI生成-- autocomplete 模糊搜索
el-autocomplete可以通过设置属性来实现模糊搜索功能。 首先需要设置一个搜索函数,即在输入框输入内容时会调用的函数,用来返回所有符合条件的结果。这个函数需要接收两个参数:输入框的值和一个回调函数。 <el-autocompletev-model"…...
怎么用手机做文字二维码?文本内容在线生成二维码技巧
手机端怎么将文字制作二维码呢?现在二维码是日常生活中经常会使用的一种工具,能够将不同的内容生成二维码使用,比如文本二维码就是常用的一种类型。那么当我们在没有电脑的情况下时,如何通过手机来快速生成二维码(二维…...
【Ap模块EM】08-怎么让Execution Management成为第一个执行的进程?
前面的文章,我们讲述了ubuntu系统上电执行的流程,那么在Ap AutoSAR中Execution Management怎么成为第一个被执行的进程呢额?就是让它取代传统的init进程,成为ubuntu系统第一个执行的进程? 我们可以通过符号链接 symbolic link去实现,这个类似于windows系统中的某个exe文件…...
使用vscode+platformio搭建arduino开发环境
存在的问题: Arduino编译时会将所有的C文件都编译一遍造成编译很慢,一个简单的工程稍加修改有可能都需要三四分钟才能编译完成,同时arduino也不支持代码跳转查看功能,不方便代码查看。 解决方法: 使用vscodeplatfor…...
java后端接口实现302跳转
正常来说,接口返回String是"redirect:"url或者“r:”url就能实现前端接收到返回后自动302.但是我在自己的一个项目中这么写了之后发现返回的是纯字符串,很奇怪。 最后发现,如果你的controller层有RestController注解,那…...
分布式理论:CAP理论 BASE理论
文章目录 1. CAP定理1.1 一致性1.2 可用性1.3 分区容错1.4 矛盾 2. BASE理论3. 解决分布式事务的思路4. 扩展 解决分布式事务问题,需要一些分布式系统的基础知识作为理论指导。 1. CAP定理 Consistency(一致性): 用户访问分布式系统中的任意节点,得到的…...
Tensorflow学习
一、处理数据的结构 案例代码如下: import tensorflow.compat.v1 as tf tf.disable_v2_behavior() import numpy as np# create data x_data np.random.rand(100).astype(np.float32) y_data x_data*0.1 0.3# 创建结构(一维结构) Weights tf.Variable(tf.random.uniform(…...
5-Ngnix配置基于用户访问控制和IP的虚拟主机
目录 5.1.Ngnix配置基于用户访问控制的多虚拟主机 5.1.1.前提条件 5.1.2.Ngnix配置基于用户访问控制的多虚拟主机 5.2.Ngnix配置基于IP的虚拟主机 5.3.Ngnix配置基于IP的多虚拟主机 Nginx配置文件在/usr/local/nginx/conf下,文件名为nginx.conf 5.1.Ngnix配置…...
springboot jar分离部署
springboot jar分离部署 注意:spring boot web项目别使用jsp页面,可以使用模板代替,jsp打包时访问页面会报404错误。 1.具体配置如下: <build><plugins><!--更换maven的jar打包插件先前使用的是spring-boot-mav…...
Opencv 细节补充
1.分辨率的解释 •像素:像素是分辨率的单位。像素是构成位图图像最基本的单元,每个像素都有自己的颜色。 •分辨率(解析度): a) 图像分辨率就是单位英寸内的像素点数。单位为PPI(Pixels Per Inch) b) PPI表示的是每英…...
内存泄漏专题(7)hook之宏定义
前面介绍的mtrace也好,bcc也罢,其实都是hook技术的一种实现,但是mtrace本身使用场景上有局限,而bcc环境依赖则十分复杂。因此,这些调试手段只适用于开发环境用来调试,对于生产环境,均不是一个非…...
Python 基础(十八):异常处理
❤️ 博客主页:水滴技术 🌸 订阅专栏:Python 入门核心技术 🚀 支持水滴:点赞👍 收藏⭐ 留言💬 文章目录 一、异常是什么?二、异常处理的基本语法三、捕获特定的异常类型四、finall…...
iTOP-RK3568开发板Docker 安装 Ubuntu 18.04
Docker 下载安装 Ubuntu18.04,输入以下命令: sudo apt update docker pull ubuntu:18.04 切换 Shell 到 Ubuntu 18.04,输入以下命令: docker container run -p 8000:3000 -it ubuntu:18.04 /bin/bash -p 参数:容器的…...
FFmpeg AVFilter的原理(三)- filter是如何被驱动的
首先上官方filter的链接:https://ffmpeg.org/ffmpeg-filters.html 关于filter命令行:FFmpeg-4.0 的filter机制的架构与实现.之一 Filter原理 1、下面是一个avfilter的graph 上图是ffmpeg中doc/examples中filtering_video.c案例的示意图。 特别注意上面蓝…...
别再让预制体‘撞衫’了!用MaterialPropertyBlock给每个Unity实例穿上‘定制皮肤’
别再让预制体‘撞衫’了!用MaterialPropertyBlock给每个Unity实例穿上‘定制皮肤’ 在游戏开发中,预制体(Prefab)是提高效率的利器,但当我们需要为大量相同预制体创建不同外观时,传统方法往往面临性能与灵活…...
Bootstrap5 轮播详解
Bootstrap5 轮播详解 Bootstrap 5 是一个流行的前端框架,它提供了丰富的组件和工具,帮助开发者快速构建响应式网站。在Bootstrap 5中,轮播组件(Carousel)得到了极大的改进,使得创建美观、互动性强的轮播图变得更加简单。本文将详细介绍Bootstrap 5轮播组件的使用方法、配…...
内容管理系统 CMS 发展史:从静态建站到 2026 智能一体化协同平台
内容管理系统(CMS)作为支撑互联网内容生态的核心基础软件,自诞生以来已走过 30 余年历程。它始终紧跟技术浪潮与市场需求,从最初简单的静态页面制作工具,逐步演进为集内容管理、低代码开发、智能分析、多端分发于一体的…...
ComfyUI Essentials:填补ComfyUI核心缺失功能的必备插件指南
ComfyUI Essentials:填补ComfyUI核心缺失功能的必备插件指南 【免费下载链接】ComfyUI_essentials 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI_essentials ComfyUI Essentials是一款专门为ComfyUI用户设计的插件,它提供了ComfyUI核心…...
内页SEO优化与网站整体优化的关系是什么_网站内页的图片优化需要注意哪些
内页SEO优化与网站整体优化的关系是什么 在当前竞争激烈的互联网环境中,网站的整体优化和内页SEO优化密不可分。内页SEO优化是提升网站整体排名的关键环节,而网站整体优化则为内页SEO提供了坚实的基础。这两者之间的关系可以从多个方面进行探讨…...
你的Selenium爬虫被‘环境调试’弹窗卡住了吗?试试先清理浏览器缓存和Cookie
Selenium爬虫环境指纹污染解决方案:从缓存清理到浏览器隔离 环境指纹污染:爬虫开发者面临的新挑战 上周三凌晨3点,我的自动化数据采集系统突然发出警报——所有Selenium爬虫实例同时失效,目标网站清一色返回"环境异常"提…...
告别重复劳动:用快马ai为ubuntu系统生成自动化运维效率工具
告别重复劳动:用快马AI为Ubuntu系统生成自动化运维效率工具 作为一名长期使用Ubuntu系统的开发者,我经常需要处理各种重复性的运维任务,比如查看日志、备份文件、监控系统资源等。这些工作虽然简单,但日复一日地手动操作不仅耗时…...
Palworld存档工具:高效解决游戏存档格式转换与数据解析的技术方案
Palworld存档工具:高效解决游戏存档格式转换与数据解析的技术方案 【免费下载链接】palworld-save-tools Tools for converting Palworld .sav files to JSON and back 项目地址: https://gitcode.com/gh_mirrors/pa/palworld-save-tools Palworld存档工具是…...
2026届毕业生推荐的五大降AI率网站解析与推荐
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 从以下方面着手,能够降低AIGC(人工智能生成内容)的检测特…...
如何用一个USB设备打造你的随身操作系统实验室?Portable-VirtualBox全攻略
如何用一个USB设备打造你的随身操作系统实验室?Portable-VirtualBox全攻略 【免费下载链接】Portable-VirtualBox Portable-VirtualBox is a free and open source software tool that lets you run any operating system from a usb stick without separate instal…...
