最熟悉的陌生人!Java运算符详解

news2024/12/25 12:39:44

在这里插入图片描述

  • 👑专栏内容:Java
  • ⛪个人主页:子夜的星的主页
  • 💕座右铭:前路未远,步履不停

目录

  • 一、算术运算符
    • 1、四则运算符
    • 2、增量运算符
    • 3、自增、自减运算符
  • 二、关系运算符
  • 三、关系运算符
    • 1、逻辑与 `&&`
    • 2、逻辑或`||`
    • 3、逻辑非`!`
    • 4、短路求值
  • 四、位运算符
    • 1、按位与 `&`
    • 2、按位或`|`
    • 3、按位取反`~`
    • 4、按位异或`^`
  • 五、移位运算符
    • 1、左移`<<`
    • 2、右移`>>`
    • 3、无符号右移 `>>>`
  • 六、条件运算符
  • 七、运算符的优先级


又见面了!还记得小学学数学的时候,那是我第一次接触到运算符这一概念。当初,我自以为已经彻底了解它们,可如今,它们却在Java中展现出了不一样的面貌,不禁让我感到有些陌生。这些曾经最熟悉的符号如今却成了我最熟悉的陌生人。今天,让我们来重新认识一下这位“ 最熟悉” 的 “陌生人” 吧!

图片描述

一、算术运算符

1、四则运算符

四则运算是指加、减、乘、除、取余这四种基本算术运算。在Java中,使用以下运算符进行四则运算:

  • 加法运算符(+):将两个数相加
  • 减法运算符(-) :将两个数相减
  • 乘法运算符(*):将两个数相乘
  • 除法运算符(/) :将两个数相除,结果为商
  • 取余运算符 (%) :求两个数相除后的余数

图片描述

        int a = 20;
        int b = 10;
        System.out.println("a+b = " + (a + b));
        System.out.println("a-b = " + (a - b));
        System.out.println("a*b = " + (a * b));
        System.out.println("a/b = " + (a / b));
        System.out.println("a%b = " + (a % b));

在这里插入图片描述
四则运算符确实和小学数学的运算规则一样,但是这里还是有几点需要注意一下。

  • 四则运算符都是二元运算符,使用时运算符必须要有左右两个操作数
  • int / int 结果还是int类型,而且会向下取整

在这里插入图片描述

3 / 2 3/2 3/2在数学中应该是1.5,但是在Java中输出结果为1。这就是因为int / int 会向下取整,即小数点之后数全部都被舍弃掉了。

  • 做除法和取模时,右操作数不能为0
    这个学过数学的都知道,因为在除法运算中,0不可以做除数。

  • 取余运算符可以应用于整数和浮点数。当运算数都是整数时,结果也是整数,当运算数包含浮点数时,结果是浮点数。

在这里插入图片描述

  • 两侧操作数类型不一致时,向更宽容的类型进行提升
    在这里插入图片描述
    +的左侧是int,右侧是double,在加之前int被提升为double

在这里插入图片描述
更宽容的类型,指的是能够容纳更广范围取值的数据类型。它们通常具有更大的取值范围或更高的精度。

Java中的类型提升规则如下表所示:

操作数类型提升为
byteint
shortint
intlong
int浮点类型
long浮点类型
floatdouble

2、增量运算符

增量运算符操作完成后,会直接将操纵的结果赋值给左操作数。

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

注意:只有变量才能使用该运算符,常量不能使用。

在这里插入图片描述

3、自增、自减运算符

自增运算符++:是给变量的值+1

自减运算符--:是给变量的值-1

前置递增 (++a):在变量 a 前面使用 ++ 运算符。它的作用是先将变量的值加1,然后返回递增后的值。也就是说,表达式的值是递增后的结果。
后置递增 (a++):在变量 a 后面使用 ++ 运算符。它的作用是先返回变量的当前值,然后再将变量的值加1。也就是说,表达式的值是递增前的结果。

在这里插入图片描述

注意:

  • 如果单独使用,【前置++】和【后置++】没有任何区别
  • --操作符给操作-1,与++含义类似。
  • 如果混合使用,【前置++】先+1,然后使用变量+1之后的值,【后置++】先使用变量原来的值,表达式结束时给变量+1
  • 只有变量才能使用自增/自减运算符,常量不能使用,因为常量不允许被修改

二、关系运算符

关系运算符主要有六个: == != ``< > <= >= ,其计算结果是 true 或者 false

注意:在Java中 = 表示赋值,而非相等,==才是相等的含义。

int a = 10;
int b = 20;
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 3 < a < 5 3<a<5,Java程序与数学在这里是有区别的。那如果我想表示 3 < a < 5 3 < a < 5 3<a<5,应该如何写呢?

三、关系运算符

1、逻辑与 &&

语法规则:表达式1 && 表达式2,左右表达式必须是boolean类型的结果。

回到上面的问题,既然在Java中不能连着写,那我想表示 3 < a < 5 3 < a < 5 3<a<5,应该如何写呢?

我们分析一下 3 < a < 5 3 < a < 5 3<a<5,这个表达式无非是想表示 a > 3 a>3 a>3并且 a < 5 a < 5 a<5 这两层意思。那我们就可以使用逻辑与运算符。a > 3 && a < 5因为只有两个表达式都为真,结果才是真,只要有一个是假,结果就是假。

表达式1表达式2结果

在这里插入图片描述

2、逻辑或||

语法规则:表达式1 || 表达式2,左右表达式必须是boolean类型的结果。

表达式1表达式2结果

在这里插入图片描述

3、逻辑非!

语法规则:! 表达式

真变假,假变真。

表达式结果
int a = 1;
System.out.println(!(a == 1));
System.out.println(!(a != 1)); 

在这里插入图片描述

4、短路求值

&& || 遵守短路求值的规则

System.out.println(10 > 20 && 10 / 0 == 0);
System.out.println(10 < 20 || 10 / 0 == 0); 

我们都知道, 计算 10 / 0 会导致程序抛出异常. 但是上面的代码却能正常运行, 说明 10 / 0 并没有真正被求值

注意:

  • 对于 && ,如果左侧表达式值为 false, 则表达式结果一定是 false, 无需计算右侧表达式

  • 对于 ||,如果左侧表达式值为 true, 则表达式结果一定是 true, 无需计算右侧表达式

  • &| 如果表达式结果为 boolean 时,也表示逻辑运算。但与 && || 相比,它们不支持短路求值

图片描述

四、位运算符

先别着急晕,如果说前面的运算符都是最熟悉的陌生人,那么位运算符就是最陌生的陌生人,因为在我们学习编程之前,很少能接触到位运算。

在Java中,主要有四个位运算符:&|~^,其中~是一元运算符,其他三个是二元运算符。这些运算符允许我们对比特位进行操作,以进行各种位级运算和操作。

图片描述

比特bit是二进制位的简称,一个二进制包含的信息量称为一比特bit。比特bit是计算机内部数据存储的最小单位。

在这里插入图片描述

1、按位与 &

位与运算符(&):将两个数的二进制表示的每一位进行逻辑与操作,只有当两个位都为1时,结果才为1。

int a = 10;
int b = 20;
System.out.println(a & b);

来猜猜这段代码的运行结果是什么。

在这里插入图片描述
没错!就是0,下面我来解释一下。进行按位运算前,需要先把10 和20 转成二进制, 分别为1010 和 10100

图片描述

然后将两个数的二进制表示的每一位都进行与运行,只有当两个位都为1时,结果才为1。最后得到的结果就是0

2、按位或|

位或运算符(|):将两个数的二进制表示的每一位进行逻辑或操作,只有当两个位都为0时,结果才为0。

int a = 10;
int b = 20;
System.out.println(a | b);

图片描述

3、按位取反~

取反运算符(~):将一个数的二进制表示的每一位取反,即0变为1,1变为0。

int a = 0xf;
System.out.printf("%x\n", ~a)

注意

  • 0x 前缀的数字为 十六进制 数字,十六进制可以看成是二进制的简化表示方式。一个十六进制数字对应 4个二进制位

  • 0xf 表示 10 进制的 15, 也就是二进制的 1111

  • printf 能够格式化输出内容, %x 表示按照十六进制输出

  • \n 表示换行符

4、按位异或^

位异或运算符(^):将两个数的二进制表示的每一位进行逻辑异或操作,只有当两个位不同时,结果才为1。

int a = 0x1;
int b = 0x2;
System.out.printf("%x\n", a ^ b);

在这里插入图片描述
由于二进制的每一位只有0和1两个数,所以我们不妨列个表格。

aba^b
000
011
101
110

不难发现,两个操作数,相同为0 不同为1。 我们也可也这样理解:异或运算就是无进位相加。

什么意思呢?用我们熟悉十进制的角度来看,比如我需要计算5+5,如果正常情况下,我们的计算结果应该是10,10拆开来看,10的个位数是0,十位数是1,可以理解为是两个个位数为5相加后进一的结果。如果不进位那就应该是00。当然十进制中并没有这种运算。

图片描述

位运算在刚开始接触的时候,确实会感到非常麻烦。但是计算机是以二进制方式进行运算和存储的,你可以理解成计算机只认识二进制,其他进制最后都需要转化成二进制计算机才能认识。而位运算是可以直接在这些二进制位上进行操作,其重要性可想而知。

五、移位运算符

移位运算符有三个: << >> >>> ,都是二元运算符,且都是按照二进制比特位来运算

1、左移<<

左移运算符(<<):将一个数的二进制表示向左移动指定的位数,左移后右边补0。

int a = 0x10;
System.out.printf("%x\n", a << 1);
// 运行结果(注意, 是按十六进制打印的)

在这里插入图片描述
注意:

  • %x 是一个格式化字符串,用于在 printf 函数中以十六进制形式打印变量的值。
  • 向左移位时,丢弃的是符号位,因此正数左移可能会编程负数

2、右移>>

右移运算符(>>):将一个数的二进制表示向右移动指定的位数,右移后左边补符号位,即正数补0,负数补1。

int a = 0x10;
System.out.printf("%x\n", a >> 1);
int b = 0xffff0000;
System.out.printf("%x\n", b >> 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次方的时候可以用移位运算代替

六、条件运算符

条件运算符只有一个:表达式1 ? 表达式2 : 表达式3
当 表达式1 的值为 true 时, 整个表达式的值为 表达式2 的值,当 表达式1 的值为 false 时, 整个表达式的值为 表达式3 的值。

// 求两个整数的最大值
int a = 10;
int b = 20;
int max = a > b ? a : b;

注意:

  • 条件运算符能少用就少用,能不用就不用。

图片描述

因为你写的代码不仅仅是给计算机看的,还要给人看。虽然条件运算符可以提供简洁和紧凑的代码。但是,过度使用条件运算符也会导致代码可读性和可维护性的下降。

七、运算符的优先级

在一条表达式中,各个运算符可以混合起来进行运算,但是运算符的优先级不同。

比如:*/ 的优先级要高于 +- ,有些情况下稍不注意,可能就会造成很大的麻烦。

// 求a和b的平均值
int a = 10;
int b = 20;
int c = a + (b - a) >> 1;
System.out.println(c);

在这里插入图片描述

上述表达式中,由于 + 的优先级要高于 >> , 因此a先和b-a的结果做加法,整体为20,最后再进行右移,因此结果为10。

Java运算符优先级表:

优先级运算符
1++, – (后缀)
2+, - (一元正号和一元负号), ~, !
3*, /, %
4+, -
5<<, >>, >>>
6<, >, <=, >=, instanceof
7==, !=
8&, ^, |
9&&
10||
11?:
12=, +=, -=, *=, /=, %=, <<=, >>=, >>>=, &=, ^=, |=

在这里插入图片描述
不要害怕!这个表看看就得了,千万别背!虽然运算符之间是有优先级的,但是具体的规则我们不必记忆。只需要在可能存在歧义的代码中加上括号即可。

// 求a和b的平均值
int a = 10;
int b = 20;
int c = a + ((b - a) >> 1);
System.out.println(c);

在这里插入图片描述


今天就说这么多啦!希望运算符这个最熟悉的陌生人从今以后能成为你最亲密的伙伴。我后续会持续更新其他Java内容,请保持关注。

图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1041503.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【PDF提取页面】使用Adobe Acrobat提取PDF文档的某几个页面另存

▚ 01 使用Adobe Acrobat打开目标文件 ▚ 02 打开 ->页面缩略图Page Thumbnails ▚ 03 右键选择 -> 提取页面 Extract Pages… ▚ 04 选择提取的页数范围 &#x1f341; 一般设置提取页面的初始位置和截至位置即可。 ▚ 05 将提取的目标页面另存为->新PDF文

基于微信小程的流浪动物救助宠物领养平台设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言系统主要功能&#xff1a;具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…

05_JavaScript基本语法

1 变量 1.1 标识符 程序开发中&#xff0c;经常需要自定义一些符号来标记一些名称&#xff0c;并赋予其特定的用途&#xff0c;如变量名、函数名等&#xff0c;这些符号都被称为标识符。 定义规则 由大小写字母&#xff08;A-Z,a-z&#xff09;、数字&#xff08;0-9&#…

[docker]笔记-网络故障处理

1、同事在虚拟机上部署docker&#xff0c;发现电脑无法登录虚拟机了。首先ping测是通的&#xff0c;从我电脑继续进行登录测试发现没问题&#xff0c;初步判断是她电脑网络和虚拟机网络之间连接出错。 2、进行虚拟机登录查看&#xff0c;首先使用route -n命令查看路由&#xf…

Java深入理解线程的三大特性

目录 1 CPU缓存导致可见性问题2 线程切换导致原子性问题3 性能优化导致有序性问题4 JMM(Java Memory Model)5 volatile6 synchronized 1 CPU缓存导致可见性问题 线程的三大特性&#xff1a; 可见性&#xff1a;Visibility有序性&#xff1a;Ordering原子性&#xff1a;Atomic…

YApi Pro

1.介绍 说明&#xff1a;YApi Pro 是一款高效、易用、功能强大的 API 管理平台&#xff0c;旨在为开发、产品、测试人员提供更优雅的接口管理服务。它可以帮助开发者轻松创建、发布、维护 API&#xff0c;同时为用户提供了优秀的交互体验&#xff0c;开发人员可以更加高效地完…

【面试算法——动态规划 19】最长回文子序列 (hard)让字符串成为回文串的最少插入次数

516. 最长回文子序列 链接: 516. 最长回文子序列 给你一个字符串 s &#xff0c;找出其中最长的回文子序列&#xff0c;并返回该序列的长度。 子序列定义为&#xff1a;不改变剩余字符顺序的情况下&#xff0c;删除某些字符或者不删除任何字符形成的一个序列。 示例 1&…

C语言实现八种功能的通讯录(添加、删除、查找、修改、显示、排序、退出、清空)

通讯录功能概要及前提说明 此通讯录利用C语言完成&#xff0c;可以实现八种功能的通讯录&#xff08;添加、删除、查找、修改、显示、排序、退出、清空&#xff09; 代码由三部分组成&#xff0c;为什么要写成三部分而不写成一部分可以参考我以前的博客&#xff0c;如下&…

【Linux】Linux多线程

怎么理解线程线程的优缺点线程的二级页表线程用途怎么管理线程线程创建获取创建后的ID方法 线程等待线程终止分离线程线程ID及进程地址空间布局 怎么理解线程 通俗易懂的说&#xff0c;线程的运行是必须有进程给它打个基础。线程的运行是服用进程的代码及空间来进行运作的。 那…

[架构之路-223]:数据管理能力成熟度评估模型DCMM简介

目录 一、背景 二、评估依据 三、评估内容 四、主要适用对象 五、能力等级 六、不同层次的文件&#xff1a; 一、背景 信息技术与经济社会的交汇融合引发了数据爆发式增长。数据蕴含着重要的价值&#xff0c;已成为国家基础性战略资源&#xff0c;正日益对全球生产、流通…

会声会影和pr哪个好用? 2023年最新功能介绍解析

随着抖音、快手、B站等视频平台的普及&#xff0c;每个人都能成为视频创作者&#xff0c;视频剪辑软件成为自媒体创作的必备工具。一些新入门视频剪辑的小伙伴可能会疑惑&#xff0c;会声会影和PR软件哪个好呢&#xff1f;今天我将从核心功能、稳定性和性价比三个方面&#xff…

从中序遍历和后序遍历构建二叉树

题目描述 106. 从中序与后序遍历序列构造二叉树 中等 1.1K 相关企业 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 示例 1: 输入&#xff1…

腾讯Mini项目课程前置学习笔记(第一轮)

Mini项目课程前置学习笔记&#xff08;第一轮&#xff09; 时间&#xff1a;5.20 ~ 5.23 项目基本介绍 项目 B. 指标监控服务重构 指标的收集与展示是后台系统监控中非常重要的一环&#xff0c;很可惜大而全的全链路监控方案并不适合我们&#xff0c;于是就有了本 mini 项目。…

cesium在vue中引入报错

npm install cesium1.95.0 找了很久各种办法都用了 最后就是降到这个版本。 在main.js中这样引入就可以运行起来了 import * as Cesium from cesium/Build/Cesium/Cesium.js; import cesium/Build/Cesium/Widgets/widgets.css; Vue.prototype.cesiumCesium 没出来是因为这个…

根据表名称快速查询表所有字段是否包含特定数据筛选

当前需要清理某个表中所有字段&#xff0c;检查是否有包含DEl字符的脏数据&#xff0c;如果字段比较少的直接根据字段查询即可&#xff0c;但是如果有几十个字段的话&#xff0c;逐个检查会很慢。 当前使用的方式是&#xff1a; 1&#xff1a;根据表名称获取当前表所有的字段 …

《信息系统项目管理师教程(第4版)》第1章至第5章 信息化发展、信息技术发展、信息系统治理、信息系统管理、信息系统工程 常见考点、知识点、思维导图、xmind

第一章至第五章多以选择题形式考察&#xff0c;分值在20分左右。已将考点、知识点整理成思维导图&#xff0c;可免费下载。以下是思维导图的部分截图&#xff1a; 第一章 信息化发展 第二章 信息技术发展 第三章 信息系统治理 第四章 信息系统管理 第五章 信息系统工程

代码随想录算法训练营第四十二天 | 动态规划 part 4 | 01背包问题(二维、一维滚动数组)、416. 分割等和子集

目录 01背包问题 二维代码 01背包问题&#xff08;一维滚动数组&#xff09;代码 416. 分割等和子集思路代码 01背包问题 二维 背包问题汇总&#xff1a; 二维数组dp——01背包五部曲 dp[i][j]表示从下标为[0-i]的物品里面任意取&#xff0c;放进容量为j的背包&#xff0c;价值…

Redis入门 (店铺营业状态设置) --苍穹外卖day4

目录 redis简介 redis下载与安装 redis服务启动与停止​编辑 redis数据类型 五种常用数据类型 各个类型特点 redis常用命令 字符串 哈希 列表 集合 有序集合 通用指令 ​在Java中操作Redis 导入坐标 编写配置类​ 通过RedisTem~对象操作 字符串 ​哈希 列…

什么是CDN

CDN是什么&#xff1f; 假设有一个IP为100.1.1.1的服务器网站&#xff0c;在没有CDN的情况下&#xff0c;PC先访问该服务器的DNS服务器&#xff0c;经过域名解析后再去访问服务器&#xff0c;如下图&#xff1a; 如果部署了CDN&#xff0c;这时候就有一个能识别CDN节点的DNS服…

经过打包后运行app.exe文件之后问题解决

项目文件经过python代码如何打包方法打包之后文件目录是下面这样的。 按照下面的路径运行app.exe文件报错&#xff1a; RuntimeError: Unable to open E:\face_detection\dist\app\face_recognition_models\models\shape_predictor_68_face_landmarks.dat [35816] Failed to…