【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案例的示意图。 特别注意上面蓝…...
手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...
【VLNs篇】07:NavRL—在动态环境中学习安全飞行
项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...
使用LangGraph和LangSmith构建多智能体人工智能系统
现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...
MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
PostgreSQL——环境搭建
一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在࿰…...
jdbc查询mysql数据库时,出现id顺序错误的情况
我在repository中的查询语句如下所示,即传入一个List<intager>的数据,返回这些id的问题列表。但是由于数据库查询时ID列表的顺序与预期不一致,会导致返回的id是从小到大排列的,但我不希望这样。 Query("SELECT NEW com…...
MLP实战二:MLP 实现图像数字多分类
任务 实战(二):MLP 实现图像多分类 基于 mnist 数据集,建立 mlp 模型,实现 0-9 数字的十分类 task: 1、实现 mnist 数据载入,可视化图形数字; 2、完成数据预处理:图像数据维度转换与…...
