【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案例的示意图。 特别注意上面蓝…...

XCTF-web-easyupload
试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...

初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...

Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案
在大数据时代,海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构,在处理大规模数据抓取任务时展现出强大的能力。然而,随着业务规模的不断扩大和数据抓取需求的日益复杂,传统…...