05.Java的运算符
1.运算符
计算机的最基本的用途之一就是执行数学运算,比如:
int a = 10;
int b = 20;
a + b;
a < b;
上述 + 和 < 等就是运算符,即:对操作数进行操作时的符号,不同运算符操作的含义不同。
作为一门计算机语言,Java也提供了一套丰富的运算符来操纵变量。Java中运算符可分为以下:算术运算符(+ - */)、关系运算符(< > ==)、逻辑运算符、位运算符、移位运算符以及条件运算符等。
1.1. 算术运算符
1. 基本四则运算符:加减乘除模(+ - * / %)
int a = 20;
int b = 10;
System.out.println(a + b); // 30
System.out.println(a - b); // 10
System.out.println(a * b); // 200
System.out.println(a / b); // 2
System.out.println(a % b); // 0 --->模运算相当于数学中除法的余数
注意:
都是二元运算符,使用时必须要有左右两个操作数
int / int 结果还是int类型,而且会向下取整
int a = 3;
int b = 2;
// 在数学中应该是1.5 但是在Java中输出结果为1 会向下取整,即小数点之后全部舍弃掉了
System.out.println(a / b);
// 如果要得到数学中的结果,可以使用如下方式
double d = a*1.0 / b;
System.out.println(d);
做除法和取模时,右操作数不能为0
int a = 1;
int b = 0;
System.out.println(a / b)
// 运行结果
Exception in thread "main" java.lang.ArithmeticException: / by zero at Test.main(Test.java:5)
//出现Exception就是出现异常,第五行出现异常
% 不仅可以对整型取模,也可以对double类型取模,但是没有意义,一般都是对整型取模的
System.out.println(11.5 % 2.0);
// 运行结果
1.5
两侧操作数类型不一致时,向类型大的提升
System.out.println(1+0.2); // +的左侧是int,右侧是double,在加之前int被提升为double
// 故:输出1.2
易错点:
public static void main(String[] args) {System.out.println(7/3);//2System.out.println(-7/3);System.out.println(7/-3);System.out.println(-7/-3);}
public static void main(String[] args) {System.out.println(10%3);System.out.println(-10%3);System.out.println(10%-3);System.out.println(-10%-3);System.out.println(11.5%2);//Java中左右两边可以是小数}
1. 增量运算符 += -= *= %=
该种类型运算符操作完成后,会将操纵的结果赋值给左操作数。
int a = 1;
a += 2; // 相当于 a = a + 2
System.out.println(a); // 输出3
a -= 1; // 相当于 a = a - 1
System.out.println(a); // 输出2
a *= 3; // 相当于 a = a * 3
System.out.println(a); // 输出6
a /= 3; // 相当于 a = a / 3
System.out.println(a); // 输出2
a %= 3; // 相当于 a = a % 2
System.out.println(a); // 输出2
注意:只有变量才能使用该运算符,常量不能使用。
//会帮我们进行类型转换
2. 自增/自减运算符 ++ --
++是给变量的值+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
只有变量才能使用自增/自减运算符,常量不能使用,因为常量不允许被修改
1.2. 关系运算符
关系运算符主要有六个: == != < > <= >= ,其计算结果是 true 或者 false 。
int a = 10;
int b = 20;
// 注意:在Java中 = 表示赋值,要与数学中的含义区分
// 在Java中 == 表示相等
System.out.println(a == b); // false
System.out.println(a != b); // true
System.out.println(a < b); // true
System.out.println(a > b); // false
System.out.println(a <= b); // true
System.out.println(a >= b); // false
注意:当需要多次判断时,不能连着写,比如:3 < a < 5(==true<5,很明显是错误的),Java程序与数学中是有区别的。
1.3. 逻辑运算符(重点)
逻辑运算符主要有三个: && || ! ,运算结果都是 boolean类型。
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. 逻辑非 !
语法规则:! 表达式
真变假,假变真。
表达式 | |
真 | 假 |
假 | 真 |
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 并没有真正被求值.
注意:
对于 && , 如果左侧表达式值为 false, 则表达式结果一定是 false, 无需计算右侧表达式.
对于 ||, 如果左侧表达式值为 true, 则表达式结果一定是 true, 无需计算右侧表达式.
& 和 | (位运算符)如果表达式结果为 boolean 时, 也表示逻辑运算. 但与 && || 相比, 它们不支持短路求值.
System.out.println(10 > 20 & 10 / 0 == 0); // 程序抛出异常
System.out.println(10 < 20 | 10 / 0 == 0); // 程序抛出异常
1.4. 位运算符
Java 中数据存储的最小单位是字节,而数据操作的最小单位是比特位. 字节是最小的存储单位,每个字节是由8个二
进制比特位组成的,多个字节组合在一起可以表示各种不同的数据。
位运算符主要有四个: & | ~ ^ ,除 ~ 是一元运算符外,其余都是二元运算符。
位操作表示 按二进制位运算. 计算机中都是使用二进制来表示数据的(01构成的序列), 按位运算就是在按照二进制位
的每一位依次进行计算.
1. 按位与 &
如果两个二进制位都是 1, 则结果为 1, 否则结果为 0.(同时为1时,结果才为1)
int a = 10;
int b = 20;
System.out.println(a & b);
进行按位运算, 需要先把 10 和 20 转成二进制, 分别为 1010 和 10100
2. 按位或 |
如果两个二进制位都是 0, 则结果为 0, 否则结果为 1.
int a = 10;
int b = 20;
System.out.println(a | b);
注意: 当 & 和 | 的操作数为整数(int, short, long, byte) 的时候, 表示按位运算, 当操作数为 boolean 的时候, 表示逻辑运算.
3. 按位取反 ~
如果该位为 0 则转为 1, 如果该位为 1 则转为 0
int a = 0xf;
System.out.printf("%x\n", ~a)
注意:
0x 前缀的数字为 十六进制 数字. 十六进制可以看成是二进制的简化表示方式. 一个十六进制数字对应 4个二进制位.
0xf 表示 10 进制的 15, 也就是二进制的 1111
printf 能够格式化输出内容, %x 表示按照十六进制输出.
\n 表示换行符
4. 按位异或 ^
如果两个数字的二进制位相同, 则结果为 0, 相异则结果为 1.
不一样结果为1,一样结果为0
int a = 0x1;
int b = 0x2;
System.out.printf("%x\n", a ^ b);
注意:如果两个数相同,则异或的结果为0
n^n=0;
0^n=n
1.5. 移位运算(了解)
移位运算符有三个: << >> >>> ,都是二元运算符,且都是按照二进制比特位来运算的。
1. 左移 <<
左移箭头朝向左
最左侧位不要了, 最右侧补 0.
int a = 0x10;
System.out.printf("%x\n", a << 1);
// 运行结果(注意, 是按十六进制打印的)
20
注意:向左移位时,丢弃的是符号位,因此正数左移可能会编程负数。
2. 右移 >>:
最右侧位不要了, 最左侧补符号位(正数补0, 负数补1)
int a = 0x10;
System.out.printf("%x\n", a >> 1);
// 运行结果(注意, 是按十六进制打印的)
8 in
t b = 0xffff0000;
System.out.printf("%x\n", b >> 1);
// 运行结果(注意, 是按十六进制打印的)
ffff8000
3. 无符号右移 >>>
最右侧位不要了, 最左侧补 0
int a = 0xffffffff;
System.out.printf("%x\n", a >>> 1);
// 运行结果(注意, 是按十六进制打印的)
7fffffff
注意:
1. 左移 1 位, 相当于原数字 * 2. 左移 N 位, 相当于原数字 * 2 的N次方.
2. 右移 1 位, 相当于原数字 / 2. 右移 N 位, 相当于原数字 / 2 的N次方.
3. 由于计算机计算移位效率高于计算乘除, 当某个代码正好乘除 2 的N次方的时候可以用移位运算代替.
4. 移动负数位或者移位位数过大都没有意义
左移补0,右移补符号位,无符号位统一补0,无无符号左移
1.6. 条件运算符
条件运算符只有一个:
表达式1 ? 表达式2 : 表达式3
当 表达式1 的值为 true 时, 整个表达式的值为 表达式2 的值;
当 表达式1 的值为 false 时, 整个表达式的值为 表达式3 的值.
也是 Java 中唯一的一个 三目运算符, 是条件判断语句的简化写法.
// 求两个整数的最大值
int a = 10;
int b = 20;
int max = a > b ? a : b;
注意:
1. 表达式2和表达式3的结果要是同类型的,除非能发生类型隐式类型转换
int a = 10;
int b = 20;
int c = a > b? 1 : 2.0;
//改正double c=a>b?1:2.0
2. 表达式不能单独存在,其产生的结果必须要被使用。
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;
System.out.println(c);
上述表达式中,由于 + 的优先级要高于 >> , 因此a先和b-a的结果做加法,整体为20,最后再进行右移,因此结果
为10。
注意:运算符之间是有优先级的. 具体的规则我们不必记忆. 在可能存在歧义的代码中加上括号即可。
// 求a和b的平均值
int a = 10;
int b = 20;
int c = a + ((b - a) >> 1);
System.out.println(c);
相关文章:
05.Java的运算符
1.运算符计算机的最基本的用途之一就是执行数学运算,比如:int a 10;int b 20;a b;a < b;上述 和 < 等就是运算符,即:对操作数进行操作时的符号,不同运算符操作的含义不同。作为一门计算机语言,Ja…...
轮转数组(力扣189)
轮转数组 题目描述: 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 示例1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7…...
主流的“对象转换工具”使用示例大全以及性能的对比
目录 前言 源码地址 代码示例 引入依赖 先定两个实体用于转换 定义一个接口让所有转换器都集成 Apache BeanUtils BeanCopier bean-mapping bean-mapping-asm Dozer 自己写get/set JMapper json2json MapStruct(推荐) ModelMapper OriK…...
分享10个不错的C语言开源项目
今天跟大家分享10个重量级的C语言开源项目,C语言确实经得住考验: Redis:Redis是一个开源的高性能的键值对数据库。它以C语言编写,具有极高的性能和可靠性。 Nginx:Nginx是一个高性能的HTTP和反向代理服务器࿰…...
【阅读笔记】JavaScript设计模式与开发实践2--闭包与单例、策略模式
目录闭包与高阶函数Function 扩展函数柯里化函数单例模式透明的单例模式惰性单例策略模式策略模式发展策略模式实现闭包与高阶函数 Array.prototype.sort 接受一个函数当作参数,用户可以自行在该函数内指定排序方式 // 由小到大排序 let res [1, 4, 2].sort((a, …...
设计模式(二十)----行为型模式之责任链模式
1、概述 在现实生活中,常常会出现这样的事例:一个请求有多个对象可以处理,但每个对象的处理条件或权限不同。例如,公司员工请假,可批假的领导有部门负责人、副总经理、总经理等,但每个领导能批准的天数不同…...
数据持久化层--冷热分离
业务场景 有一个系统的主要功能是这样的:它会对接客户的邮件服务器,自动收取发到几个特定客服邮箱的邮件,每收到一封客服邮件,就自动生成一个工单。之后系统就会根据一些规则将工单分派给不同的客服专员处理。 这家媒体集团客户两年多产生了近2000万的工单,工单的操作记…...
Ubuntu16.04系统 VSCode中python开发插件的安装
VSCode中python开发插件的安装 1. python python插件提供了代码分析,高亮,规范化等很多基本功能 2. Python for vscode 3. Python Preview 实时可视化你的代码结果。如果你Leedcode等题时,可以安装这个插件。能为VSCode切换各种主题皮肤…...
buuctf-pwn write-ups (12)
文章目录buu093-wustctf2020_easyfastbuu094-ciscn_2019_es_1buu095-wdb2018_guessbuu096-gyctf_2020_some_thing_excetingbuu097-axb_2019_heapbuu098-oneshot_tjctf_2016buu099-护网杯_2018_gettingstartbuu100-wustctf2020_number_gamebuu101-zctf2016_note2buu093-wustctf2…...
Linux- 系统随你玩之--网络上的黑客帝国
文章目录1、前言2、TCPDump介绍2.1、问题来了: 所有用户都可以采用该命令吗?2.2、抓包原理2.3、特点2.3.1、参数化支持2.2.2、 TCP功能3、 服务器安装Tcpdump3.1、安装3.2、检查安装是否正常。4、tcpdump 命令4.1、常用功能选项4.2、输出内容5、实操5.1、…...
Python每日一练(20230312)
目录 1. 提示用户输入的简单菜单 ★ 2. 字母异位词分组 ★★ 3. 俄罗斯套娃信封问题 ★★★ 🌟 每日一练刷题专栏 C/C 每日一练 专栏 Python 每日一练 专栏 1. 提示用户输入的简单菜单 如果用户选择菜单选项1,提示用户输入1到10之间的整数&a…...
人生又有几个四年
机缘 不知不觉,已经来 csdn 创作四周年啦~ 我是在刚工作不到一年的时候接触 csdn 的,当时在学习 node,对 node 的文件相关的几个 api 总是搞混,本来还想着在传统的纸质笔记本上记一下,但是想想我大学记了好久的笔记本…...
第九章:Java集合
第九章:Java集合 9.1:Java集合框架概述 数组、集合都是对多个数据进行存储(内存层面,不涉及持久化)操作的结构,简称Java容器。 数组存储多个数据方面的特点 一旦初始化以后,其长度就确定了。数组一旦定义好ÿ…...
嵌入式学习笔记——STM32的USART通信概述
文章目录前言常用通信协议分类及其特征介绍通信协议通信协议分类1.同步异步通信2.全双工/半双工/单工3.现场总线/板级总线4. 串行/并行通信5. 有线通信、无线通信STM32通信协议的配置方式使用通信协议控制器实现使用IO口模拟的方式实现STM32串口通信概述什么是串口通信STM32F40…...
MySQL性能优化
MySQL性能调优 存储数据类型优化 尽量避免使用 NULL尽量使用可以的最小数据类型。但也要确保没有低估需要存储的范围整型比字符串操作代价更低使用 MySQL 内建的数据类型(比如date、time、datetime),比用字符串更快 基本数据类型 数字 整数…...
C语言/动态通讯录
本文使用了malloc、realloc、calloc等和内存开辟有关的函数。 文章目录 前言 二、头文件 三、主界面 四、通讯录功能函数 1.全代码 2.增加联系人 3.删除联系人 4.查找联系人 5.修改联系人 6.展示联系人 7.清空联系人 8.退出通讯录 总结 前言 为了使用通讯录时,可以…...
我用Compose做了一个地图轮子OmniMap
一、前言 半年前,我发布过一篇介绍:Compose里面如何使用地图,比如高德地图 的文章,原本是没有想造什么轮子的✍️ 闲来无事,有一天看到了评论区留言让我把源码地址分享出来,我感觉我太懒了,后来…...
STM32之SPI
SPISPI介绍SPI是串行外设接口(Serial Peripherallnterface)的缩写,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便…...
02 深度学习环境搭建
1、查看对应版本关系 详细见:https://blog.csdn.net/qq_41946216/article/details/129476095?spm1001.2014.3001.5501此案例环境使用 CUDA 11.7、Pytouch1.12.1、Miniconda3_py38(含Python3.8) 2. 安装Anaconda 或 Miniconda 本案例重点一为Miniconda准 2.1 安…...
PHP导入大量CSV数据的方法分享
/** * @description 迭代器读取csv文件 * @param $strCsvPath * @return \Generator */ public static function readPathCsvFile($strCsvPath) { if ($handle = fopen($strCsvPath, r)) { while (!feof($handle)) { yield fgetcsv($handle); } …...
代码看不懂?ChatGPT 帮你解释,详细到爆!
偷个懒,用ChatGPT 帮我写段生物信息代码如果 ChatGPT 给出的的代码不太完善,如何请他一步步改好?网上看到一段代码,不知道是什么含义?输入 ChatGPT 帮我们解释下。生信宝典 1: 下面是一段 Linux 代码,请帮…...
【MyBatis】篇三.自定义映射resultMap和动态SQL
MyBatis整理 篇一.MyBatis环境搭建与增删改查 篇二.MyBatis查询与特殊SQL 篇三.自定义映射resultMap和动态SQL 篇四.MyBatis缓存和逆向工程 文章目录1、自定义映射P1:测试数据准备P2:字段和属性的映射关系P3:多对一的映射关系P4:一对多的映射关系2、动态SQL2.1 IF标签2.2 w…...
什么是API?(详细解说)
编程资料时经常会看到API这个名词,网上各种高大上的解释估计放倒了一批初学者。初学者看到下面这一段话可能就有点头痛了。 API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开…...
比cat更好用的命令!
大家好,我是良许。 作为程序员,大家一定对 cat 这个命令不陌生。它主要的功能就是用来显示文本文件的具体内容。 但 cat 命令两个很重大的缺陷:1. 不能语法高亮输出;2. 文本太长的话无法翻页输出。正是这两个不足,使…...
MySQL、HBase、ElasticSearch三者对比
1、概念介绍 MySQL:关系型数据库,主要面向OLTP,支持事务,支持二级索引,支持sql,支持主从、Group Replication架构模型(本文全部以Innodb为例,不涉及别的存储引擎)。 HBas…...
Vue+ElementUI+Vuex购物车
最完整最能理解的Vuex版本的购物车购物车是最经典的小案例。Vuex代码:import Vue from vue import Vuex from vuex import $http from ../request/http Vue.use(Vuex)const store new Vuex.Store({state:{shopList:[],},mutations:{setShopCarList(state,payload)…...
Android 录屏 实现
https://lixiaogang03.github.io/2021/11/02/Android-%E5%BD%95%E5%B1%8F/ https://xie.infoq.cn/article/dd40cd5d753c896225063f696 视频地址: https://time.geekbang.org/dailylesson/detail/100056832 概述 在视频会议、线上课堂、游戏直播等场景下&#x…...
【CSAPP】家庭作业2.55~2.76
文章目录2.55*2.56*2.57*2.58**2.59**2.60**位级整数编码规则2.61**2.62***2.63***2.64*2.65****2.66***2.67**2.68**2.69***2.70**2.71*2.72**2.73**2.74**2.75***2.76*2.55* 问:在你能访问的不同的机器上,编译show_bytes.c并运行代码,确定…...
Python操作MySQL数据库详细案例
Python操作MySQL数据库详细案例一、前言二、数据准备三、建立数据库四、处理和上传数据五、下载数据六、完整项目数据和代码一、前言 本文通过案例讲解如何使用Python操作MySQL数据库。具体任务为:假设你已经了解MySQL和知识图谱标注工具Brat,将Brat标注…...
MicroBlaze系列教程(8):AXI_CAN的使用
文章目录 @[toc]CAN总线概述AXI_CAN简介MicroBlaze硬件配置常用函数使用示例波形实测参考资料工程下载本文是Xilinx MicroBlaze系列教程的第8篇文章。 CAN总线概述 **CAN(Controller Area Network)**是 ISO 国际标准化的串行通信协议,是由德国博世(BOSCH)公司在20世纪80年代…...
手机网站模版 优帮云/推广赚钱软件排行
如果你想从头学习Jmeter,可以看看这个系列的文章哦 https://www.cnblogs.com/poloyy/category/1746599.html 简单介绍 约定响应时间,响应时间如果超出约定,则断言为失败 断言持续时间 断言持续时间界面介绍 只需要填写预期的运行时间就行了 结…...
wordpress去除/seo搜索引擎优化是什么意思
一、头插法新建链表 1、先让新结点指向头结点所指向的结点 2、再让头结点指向新结点 //头插法新建链表 void head_insert_list(Linklist &L) //Linlilist 与Lnode*等价 {Elemtype e;scanf("%d", &e);Linklist s; //s指针用来记录新申请的结点while(e!999…...
建筑设计资料网站/网站seo关键词优化
网络游戏的数据变动比较频繁,如果每次数据变动都刷往后端数据库,会导致数据库不负重荷。在游戏逻辑和数据库间提供一层缓冲服务,有利于减轻这重压力. 首先,网络游戏的数据在数据库中是以表的形式保存的,每个玩家的数据…...
双流县规划建设局网站/南宁网站推广大全
本文已收录于专栏 🌳《画解数据结构》🌳 零、前言 目前本专栏正在进行优惠活动,在博主主页添加博主好友(好友位没有满的话),可以获取 付费专栏优惠券。 「 数据结构 」 和 「 算法 」 是密不可分的,两者往往是「 相辅相成 」的存在,所以,在学习 「 数据结构 」 的过…...
王烨玺/优化seo设置
--《人在囧途》观后感 作者:朱金灿 来源:http://blog.csdn.net/clever101 国庆假期的一个晚上突然把电卡的电用完了,只好借同屋的笔记本来看电影,选了王宝强的《人在囧途》来看。该片讲述一个充满戏剧化的回家过年故事…...
龙华网站建设招聘/网站推广策划思路的内容
在2019腾讯全球数字生态大会新闻发布会上,腾讯云联合腾讯研究院,共同发布了行业重磅报告:《产业互联网——构建智能时代数字生态新图景》。报告首次阐述了产业互联网的战略框架和实践方法论。报告指出,产业互联网的实现࿰…...