【JavaSE笔记】运算符

news2024/9/25 15:28:10

一、前言

作为Java编程中最基本的语法元素之一,运算符在编写程序时扮演着至关重要的角色。

运算符被用于执行各种数学和逻辑运算,以及比较操作,运算符的使用可以使代码更加简洁、易读和高效。在本文中,我们将会详细介绍Java中常见的运算符,并提供一些示例代码来更好地理解和掌握这些运算符的使用方法。

二、运算符的介绍

运算符是一种特殊符号,用于在程序中进行数学、逻辑或位运算。它们可以用于执行不同类型的操作。

例如:加、减、乘、除、等于、不等于、逻辑与、逻辑或、按位与、按位或等。在Java中,运算符通常用于操作变量,可以帮助程序员实现各种复杂的计算和逻辑处理。

int a = 10;
int b = 20;
a + b;
a < b;

上述 +< 等就是运算符,即:对操作数进行操作时的符号,不同运算符操作的含义不同。

作为一门计算机语言,Java也提供了一套丰富的运算符来操纵变量。Java中运算符可分为以下:

  • 算术运算符(+ - * / %)
  • 关系运算符(< > ==)
  • 逻辑运算符
  • 位移位运算符
  • 条件运算符

三、算术运算符

1、四则运算符

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

  1. 加法运算符(+):将两个数相加。
  2. 减法运算符(-) :将两个数相减。
  3. 乘法运算符(*):将两个数相乘。
  4. 除法运算符(/) :将两个数相除,结果为商。
  5. 取余运算符 (%) :求两个数相除后的余数
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)
  • 在Java中,取余运算符可以应用于整数和浮点数。当运算数都是整数时,结果也是整数,当运算数包含浮点数时,结果是浮点数。
System.out.println(11.5 % 2.0);
// 运行结果
1.5
  • 两侧操作数类型不一致时,向类型大的提升
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); // 输出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

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

  • 只有变量才能使用自增/自减运算符,常量不能使用,因为常量不允许被修改

四、关系运算符

关系运算符主要有六个: == != < > <= >= ,其计算结果是 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,Java程序与数学中是有区别的

五、逻辑运算符

逻辑运算符主要有三个: && || ! ,运算结果都是 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 时, 也表示逻辑运算. 但与 && || 相比, 它们不支持短路求值

六、位运算符

Java 中数据存储的最小单位是字节,而数据操作的最小单位是比特位,字节是最小的存储单位,每个字节是由8个二进制比特位组成的,多个字节组合在一起可以表示各种不同的数据。

位运算符主要有四个: & | ~ ^ ,除 ~ 是一元运算符外,其余都是二元运算符。

位操作表示 按二进制位运算. 计算机中都是使用二进制来表示数据的(0或1构成的序列), 按位运算就是在按照二进制位的每一位依次进行计算。

1、按位与&

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

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

进行按位运算, 需要先把 10 和 20 转成二进制, 分别为 1010 和 10100

image-20230506211246126

2、按位或|

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

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

image-20230506211334589

注意: 当 &| 的操作数为整数(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、按位异或^

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

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

注意:如果两个数相同,则异或的结果为0

七、移位运算符

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

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
int b = 0xffff0000;
System.out.printf("%x\n", b >> 1);
// 运行结果(注意, 是按十六进制打印的)
ffff8000

3、无符号右移 >>>

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

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

注意:

  • 左移 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;

注意:

  • 表达式2和表达式3的结果要是同类型的,除非能发生类型隐式类型转换
int a = 10;
int b = 20;
int c = a > b? 1 : 2.0;
  • 表达式不能单独存在,其产生的结果必须要被使用
int a = 10;
int b = 20;
a > b? a : b; 
// 报错:Error:(15, 14) java: 不是语句

九、运算符的优先级

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

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

// 求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);

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

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

相关文章

nginx反向代理,用户访问服务器1的80端口,请求转发至服务器2,3的8882端口

两台应用服务器&#xff0c;一台nginx&#xff0c;用户访问nginx服务器80端口&#xff0c;将请求转发至服务器2和服务器3的8882端口。 1、修改nginx配置文件 upstream backend {server 10.60.16.187:8882;server 10.60.16.188:8882;}server {listen 80;server_name 10.6…

Git(9)——Git多人协同开发之创建初始项目

目录 一、简介 二、创建新项目 三、本地Git接入 四、创建远端仓库——Gitee 五、推送代码至远端仓库 一、简介 前面8章都是我们一个人独自开发&#xff0c;如果现在项目新增两名同事&#xff0c;我们就需要使用Git来实现多人协同开发&#xff0c;从第九章开始将介绍从零到…

Atlas VPN 曝零日漏洞,允许查看用户真实 IP 地址

Atlas VPN 已确认存在一个零日漏洞&#xff0c;该漏洞允许网站所有者查看 Linux 用户的真实 IP 地址。不久前&#xff0c;发现该漏洞的人在Reddit上公开发布了有关该零日漏洞的详细信息以及漏洞利用代码。 关于 Atlas VPN 零日漏洞 Atlas VPN提供 "免费 "和付费的 …

GemBox.Bundle 47.0.1227 Crack

GemBox.Document 35.0.1480 GemBox.Email 17.0.1147 GemBox.Imaging 10.0.1096 GemBox.Pdf 17.0.1404 GemBox.Presentation 25.0.1526 GemBox.Spreadsheet 49.0.1454 GemBox.Spreadsheet 从 .NET 应用程序读取、写入、转换和打印 XLSX、XLS、XLSB、CSV、HTML 和 ODS 电子表…

算法题笔记 1-5

目录 week 11. 找出数组中重复的数字题目数据范围样例题解(数组遍历) O(n) 2. 不修改数组找出重复的数字题目数据范围样例题解(分治&#xff0c;抽屉原理) O(nlogn) 3. 二维数组中的查找题目题解(单调性扫描) O(nm) 4.替换空格题目题解(线性扫描) O(n)(双指针扫描) O(n) 5.从尾…

一阶滞后低通滤波器(支持采样频率设置 博途SCL代码)

一阶低通滤波器算法介绍这篇博客不再赘述&#xff0c;专栏有很多的文章讲过。之前的低通滤波器都是没有采样频率接口的&#xff0c;低通滤波器的采样频率都等于定时中断周期&#xff0c;实际滤波效果和信号采样频率、滤波系数、信号采样频率都有关系&#xff0c;所以这里我们将…

【C语言】指针的进阶(二)—— 回调函数的讲解以及qsort函数的使用方式

目录 1、函数指针数组 1.1、函数指针数组是什么&#xff1f; 1.2、函数指针数组的用途&#xff1a;转移表 2、扩展&#xff1a;指向函数指针的数组的指针 3、回调函数 3.1、回调函数介绍 3.2、回调函数的案例&#xff1a;qsort函数 3.2.1、回顾冒泡排序 3.2.1、什么是qso…

Python 10之异常模块包

&#x1f600;前言 在Python编程中&#xff0c;我们时常会遇到各种异常和错误&#xff0c;同时我们也会使用多个模块和包来组织和结构化我们的代码。理解如何有效地处理异常和组织我们的代码是成为一个成功的Python程序员的关键。 . 在本教程中&#xff0c;我们将深入探讨Pytho…

10.3 滤波电路

整流电路的输出电压虽然是单一方向的&#xff0c;但是含有较大的交流成分&#xff0c;不能适应大多数电子电路及设备的需要。因此&#xff0c;一般在整流后&#xff0c;还需利用滤波电路将脉动的直流电压变为平滑的直流电压。与用于信号处理的滤波电路相比&#xff0c;直流电源…

Friend.tech和Tip Coin爆火!去中心化社交热度再起?

在Web2.0时代&#xff0c;用户对于大型中心化社交平台的信任逐渐降低&#xff0c;于是&#xff0c;去中心化的Web3社交应用也开始如雨后春笋般冒出。其中&#xff0c;像Friend.tech和Tip Coin这样的项目一经推出便在Twitter等平台刷爆了热榜。 Friend.tech基于Coinbase Layer 2…

SAP FI之自动付款程序运行 F110

简介 付款流程包括以下步骤 输入发票分析未结发票的到期日准备应付发票付款被批准或修改发票已付款 始终需要处理大量的发票。 必须按时支付应付帐款发票才能获得可能的折扣。 会计部门希望自动执行此发票处理。 自动付款程序是一种可以帮助用户管理应付帐款的工具。 SAP 为用…

Python 自定义模块

视频版教程 Python3零基础7天入门实战视频教程 Python中已经有很多的内置模块&#xff0c;以及也有很多的第三方优秀模块&#xff0c;我们直接导入使用即可。 当然我们有时候也需要自己定义一些自定义模块&#xff0c;来实现我们项目的功能。 看下案例&#xff1a; 先定义s…

基于Java的大学生在线租房平台的设计与实现(亮点:合理的租房流程、房屋报修、多角色、在线评论回复)

校园点餐小程序 一、前言二、我的优势2.1 自己的网站2.2 自己的小程序&#xff08;小蔡coding&#xff09;2.3 有保障的售后2.4 福利 三、开发环境与技术3.1 MySQL数据库3.2 Vue前端技术3.3 Spring Boot框架3.4 微信小程序 四、功能设计4.1 主要功能描述 五、系统实现5.1 前面界…

SpringBoot实战(二十四)集成 LoadBalancer

目录 一、简介1.定义2.取代 Ribbon3.主要特点与功能4.LoadBalancer 和 OpenFeign 的关系 二、使用场景一&#xff1a;Eureka LoadBalancer服务A&#xff1a;loadbalancer-consumer 消费者1.Maven依赖2.application.yml配置3.RestTemplateConfig.java4.DemoController.java 服务…

浏览器事件机制详解

目录 前言 事件类型 鼠标事件 表单事件 窗口事件 DOM事件 多媒体事件 拖拽与放置事件 移动设备事件 剪切板事件 错误事件 过渡、动画事件 事件监听 onevent addEventListener(event) 事件触发 事件流程 捕获阶段 目标阶段 冒泡阶段 事件对象 总结 相关代…

记一次 .NET 某电力系统 内存暴涨分析

一&#xff1a;背景 1. 讲故事 前些天有位朋友找到我&#xff0c;说他生产上的程序有内存暴涨情况&#xff0c;让我帮忙看下怎么回事&#xff0c;最简单粗暴的方法就是让朋友在内存暴涨的时候抓一个dump下来&#xff0c;看一看大概就知道咋回事了。 二&#xff1a;Windbg 分…

Stream之实现原理分析

文章目录 1 Stream原理1.1 引言1.2 操作分类1.3 操作分类例子分析1.4 一种直白的实现方式1.5 Stream流水线解决方案1.5.1 操作如何记录1.5.2 操作如何叠加1.5.3 叠加之后的操作如何执行1.5.4 执行后的结果在哪里 1 Stream原理 1.1 引言 我们已经学会如何使用 Stream API&…

(vue的入门

vue的入门 一. Vue是什么二. Vue的特点及优势三. 使用Vue的详细步骤四. Vue的基本语法五. Vue的生命周期 一. Vue是什么 Vue&#xff08;发音为/“vjuː”/&#xff0c;类似于"view"&#xff09;是一套用于构建用户界面的渐进式JavaScript框架。它是一个开源的、轻量…

[字符串和内存函数]strcmp字符串函数的详解和模拟

strcmp函数 strcmp函数是一个用于比较两个字符串的C标准库函数。它的原型为&#xff1a; int strcmp(const char* str1, const char* str2);strcmp函数会比较str1和str2两个字符串的字符序列&#xff0c;并返回一个整数值来表示它们之间的大小关系。返回值的含义如下&#xff…

2023-简单点-IOU计算

机器视觉中的坐标体系 注意区分x,y坐标系和row,col排布 IOU交集 代码 def IOU(RecA, RecB):recA是坐标形式是[X[左上点],y[左上点],x[右下点],y[右下点]]#找到交集框的左上和右下点&#xff0c;可以计算交集面积xA max(RecA[0], RecB[0])yA max(RecA[1], RecB[1])xB min(R…