【JavaSE-3】运算符

1、什么是运算符

就是对常量或者变量进行操作的符号,如:+,-,*,/

表达式:

用运算符把常量或者变量连接起来的,符合java语法的式子就是表达式。

2、 算术运算符

2.1、基本四则运算符+ - * / %

都是二元运算符,也就是说使用时需要左右两边有操作数。

+ - * :跟小学数学中一模一样没有任何区别,这里不做介绍。

/ 整除

两数相除结果只能得到整除,如果结果想要是小数,必须要有小数参与。但是代码中,如果有小数参与计算,结果可能不精确。

例子:

public static void main(String[] args) {
	System.out.println(1.1 + 1.01);
	System.out.println(1.1 + 1.1);
	System.out.println(10.0 / 3);
    System.out.println(10 / 3);
}

【运行结果】

2.1100000000000003
2.2
3.3333333333333335
3

% 取余(取模)

  • 两边的操作数不仅可以是整数,也可以是小数,但是对小数没有意义,一般都是对整数取模
  • 求模结果的正负号由第一个运算符的正负号决定。
  • 如果操作数中存在小数,则结果为小数否则结果为整数

例子:

System.out.println(10%3);//1
System.out.println(10%-3);//1
System.out.println(-10%3);//-1 
//求模结果的正负号由第一个运算数的正负号决定
System.out.println(-10%-3);//-1
//java中可以对小数求余数,但是没有意义,一般都是对整数取模
System.out.println(11.5%2);//1.5
System.out.println(-11.5%2);//-1.5
System.out.println(9.0 % 3);//0.0
//如果操作数中存在小数,则求余结果为小数,否则结果是整数
System.out.println(9 % 3);//0

【注意】

做除法和取模时,右操作数不能为 0

int a = 1;
int b = 0;
System.out.println(a/b);

会报出错误,称为异常。如下所示:

Exception in thread "main" java.lang.ArithmeticException: / by zero
	at Test01.main(Test01.java:31)

两侧操作数类型不一致时,向类型大的提升,也就是发生自动类型转换(隐式转换)。

System.out.println(1+0.2);
//+左侧是int,右侧是double,在加之前int被提升为double,所以输出1.2

【练习】

需求:键盘录入一个三位数,拆分为个位,十位,百位,打印在控制台上

【代码示例】

import java.util.Scanner;
public static void main(String[] args) {
	//获取一个数的每一位
	//1.键盘录入一个三位数
	//导包 --- 创建对象 --- 接收数据
	Scanner sc = new Scanner(System.in);
	System.out.println("请输入一个三位数:");
	int number = sc.nextInt();//123
	//2.获取这个三位数的个位、十位、百位并打印出来
	int ge = number % 10;
	int shi = number / 10 % 10;
	int bai = number / 100 % 10;
	//3.输出结果
	System.out.println(ge);
	System.out.println(shi);
	System.out.println(bai);
}

2.1.1、字符串的拼接+

  • +符号前者后出现字符串时,此时就是字符串的连接符,会将前后的数据进行拼接,并产生一个新的字符串。
  • 当连续进行+操作时,从左到右逐个执行的。

例子1:

"123"+123;

此时进行的是字符串的拼接,结果是"123123"

例子2:

1+"23"+56;

先进行字符串的拼接,结果是"123",然后和56进行字符串拼接,最终结果是"12356"

例子3:

1+56+"89"+1+2;

先进行的是整数的加法运算,结果是57,之后和字符串"89"进行拼接,结果是"5789",然后依次和后面的1 2进行拼接,最终结果是"578912"

例子4:

String name = "小明";
System.out.println("我的名字是" + name);

结果是:我的名字是小明

2.1.2、字符的+

  • 字符 + 字符
  • 字符 + 数字

以上两种情况出现时,会拿着字符到计算机内置的ASCII码表中去查字符对应的数字,然后再进行数值的计算。

常用的ASCII码值:

‘a’----97

‘A’----65

例子1:

char a = 'a';
System.out.println(a);
System.out.println(a + "字符串");//字符串的拼接
System.out.println(a + 1);//字符的+

【运行结果】

a
a字符串
98

例子2:

char c1 = 'a';
char c2 = 'b';
System.out.println(c1+c2);

【运行结果】

195

2.2、赋值运算符= += -= *= /= %=

2.2.1、=

赋值运算符=,也就是将等号右边的结果赋值给左边的变量。

例子:

//1.最为简单的赋值运算符用法
int a = 10;//就是把10赋值给变量a
System.out.println(a);

//2.如果等号右边需要进行计算。
int b = 20;
int c = a + b;//先计算等号右边的表达式,把计算的结果赋值给左边的变量
System.out.println(c);

//3.特殊的用法
a = a + 10;//先计算等号右边的,把计算的结果赋值给左边的变量
System.out.println(a);//20

2.2.2、增量运算符+= -= *= /= %=

运算规则:

就是把左边跟右边进行运算,把最终的结果赋值给左边,对右边没有任何影响。

例子:

public static void main(String[] args) {
	//扩展赋值运算符
	int a = 10;
	int b = 30;
	a += b;//把左边和右边相加,再把最终的结果赋值给左边,对右边没有任何影响
	// 相当于 a = a + b;
	System.out.println(a);//40
	System.out.println(b);//30
}

【注意】

增量运算符会帮助进行强制类型转换

long a1 = 100L;
int a2 = 200;
//a2 = a1+a2;//error,因为等式右边计算后是long类型,与左边不同
a2 += a1;//没有报错,因为运算符会实现类型转换
//具体实现:a2 = (int)(a2 + a1),也就是会实现强制类型转换
System.out.println(a2);//300

2.3、自增/自减运算符++ --

++:就是把变量里面的值+1

--:就是把变量里面的值-1

例子1:

//++
int a = 10;
a++;//就是让变量a里面的值 + 1
System.out.println(a);//11
++a;//就是让变量a里面的值 + 1
System.out.println(a);//12

例子2:

int a = 10;
int b = a++;//先将a的值赋给b,然后a的值++
System.out.println(a);//11
System.out.println(b);//10

int a2 = 10;
int b2 = ++a2;//先将a2的值++,然后将结果赋值给b2
System.out.println(a2);//11
System.out.println(b2);//11

【注意】

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

3、关系运算符

又叫比较运算符,其实就是拿着左边跟右边的值进行判断。

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

【注意】

  1. 如果需要多次判断时,不能连着写,如:int a = 4;3<a<5。和 C语言中不同,因为 C语言中的可以用 0 或 1 表示false或者true,但是在 java 中,3<a结果是true然后是true < 5两者不能进行比较,会报错。
  2. 关系运算符最终结果一定是布尔类型,要么是true要么是false

4、逻辑运算符‼️

有三种运算符,分别是:&& || !运算结果都是boolean类型。

4.1、逻辑与&&

语法规则:表达式1 && 表达式2左右表达式必须是boolean类型的结果
只有两个表达式同时为真,最后结果才为真,有 1 个为假最后结果就是假。

例子:

public class Main{
	public static void main(String[] args) {
		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); // 左为假 且 右为假 则结果为假
	}
}

4.2、逻辑或||

语法规则:表达式1 || 表达式2左右表达式必须是boolean类型的结果
只要有一个为真结果就是真,只有两个表达式都为假结果才是假。

例子:

public class Main{
	public static void main(String[] args) {
		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); // 左为假 且 右为假 则结果为假
	}
}

4.3、逻辑非!

语法规则:!表达式 表达式也要是布尔表达式!!真变假,假变真

例子1:

所以需要将表达式改为布尔表达式。

例子2:

public class Main{
	public static void main(String[] args) {
		int a = 1;
		System.out.println(!(a==1)); //括号结果为真,取非,最终结果为假
		System.out.println(!(a==2)); //括号结果为假,取非,最终结果为真
	}
}

4.4、短路求值

短路求值涉及到的运算符:&& ||

//短路求值
//短路与 当表达式1为假时,就不会执行表达式2
System.out.println(10 > 20 && 10 / 0 == 0);//false
//短路或 当表达式1为真时,就不会执行表达式2
System.out.println(10 < 20 || 10 / 0 == 0);//true

例子1:

public class Main{
	public static void main(String[] args) {
		int a = 10;
		int b = 20;
		//表达式结果是boolean类型时,表示逻辑运算
		System.out.println(a > b);//flase
		System.out.println(a < b);//true
		System.out.println(a > b && 10/0 == 0);//如果发生短路运算,则只会执行表达式1,结果是false,不会执行表达式2,因此不会报错
		System.out.println(a < b || 10/0 == 0);//如果发生短路运算,则只会执行表达式1,结果是true,不会执行表达式2,因此不会报错
	}
}

例子2:

public class Main{
	public static void main(String[] args) {
		int a = 10;
		int b = 10;
		boolean result = ++a < 5 && ++b < 5;//表达式1 ++a < 5为假,所以不执行表达式2
		System.out.println(result);//false
		System.out.println(a);//11
		System.out.println(b);//10
	}
}

5、位运算符

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

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

除了按位取反~是一元运算符外,其余都是二元运算符。

5.1、按位与&

如果两个二进制位都是 1, 则结果为 1, 否则结果为 0

例子:

public class Main{
	public static void main(String[] args) {
		int a = 10;
		int b = 20;
		System.out.println(a & b);//0
		System.out.println(a & a);//10
	}
}

5.2、按位或|

如果两个二进制位都是 0, 则结果为 0, 否则结果为 1

例子:

public class Main{
	public static void main(String[] args) {
		int a = 10;
		int b = 20;
		System.out.println(a | b);//30
		System.out.println(a | a);//10
	}
}

& | 的操作数为整数(int, short, long, byte) 的时候, 表示按位运算, 当操作数为 boolean 的时候, 表示逻辑运算但是和逻辑运算不同的是不支持短路求值

例子1:

public static void main(String[] args) {
	//短路逻辑运算
	System.out.println(10 > 20 && 10 / 0 == 0);
	System.out.println(10 < 20 || 10 / 0 == 0);
}

【运行结果】

flase
true

例子2:

public static void main(String[] args) {
	//按位运算
	System.out.println(10 > 20 & 10 / 0 == 0);
	System.out.println(10 < 20 | 10 / 0 == 0);
}

【运行结果】

例子3:

public static void main(String[] args) {
	int a = 10;
	int b = 10;
	boolean result = ++a < 5 & ++b < 5;//会左右两边都进行计算
	System.out.println(result);
	System.out.println(a);
	System.out.println(b);
}

【运行结果】

false
11
11

5.3、按位取反~

如果该二进制位为 0 则转为 1, 如果该二进制位为 1 则转为 0

public class Main{
	public static void main(String[] args) {
		int a = 0xf;
		System.out.printf("%x\n",a);//f
		System.out.printf("%d\n",a);//15
		System.out.printf("%x\n",~a);//fffffff0
		System.out.printf("%d\n",~a);//-16
	}
}
/*
因为a占4字节,所以内存中补码是00000000 00000000 00000000 00001111
然后按位取反,得11111111 11111111 11111111 11110000 
十六进制是ff ff ff f0
转为原码是10000000 00000000 00000000 00010000 => -16
*/

【注意】:

  • 如果该位为 0 则转为 1, 如果该位为 1 则转为 0 。
  • 0x 前缀的数字为 十六进制 数字. 十六进制可以看成是二进制的简化表示方式. 1 个十六进制数字对应 4个二进制位。
  • 0xf 表示十进制的 15, 也就是二进制的1111。
  • printf 能够格式化输出内容, java 中可以像 C语言那样按照格式输出,%x 表示按照十六进制输出。
  • \n 表示换行符。

5.4、按位异或^

如果两个数字的二进制位相同, 则结果为 0, 相异则结果为 1。

例子1:

n^n=0 0^n=n

例子2:

int a = 1;
int b = 2;
System.out.println(a ^ b);//3

因为a的二进制是0001,b的二进制是0010,对应二进制位进行比较,得出结果是0011,对应的十进制是3。

6、移位运算符

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

左移<<

最左侧位不要了,最右侧补0

左移一位相当于乘以 2,在右边补 0,左边舍弃

public class Main{
	public static void main(String[] args) {
		byte a = 65; //0100 0001
		System.out.printf("%d\n",a << 1);//10000010 130
		System.out.printf("%d\n",a);//65
	}
}

注意左移时,丢弃的是符号位,所以正数的左移可能会变成负数。


右移>>

在左边补符号位(正数补 0,负数补 1),最右侧位不要了

右移一位相当于除以(/) 2,

无符号右移>>>

最右侧位不要了,左边统一补 0

没有<<<,因为左移统一都是在右边补 0

7、条件运算符(三元运算符)

格式:关系表达式?表达式 2:表达式 3

关系表达式 的值为 true 时, 整个表达式的值为 表达式2 的值;
关系表达式 的值为 false 时, 整个表达式的值为 表达式3 的值。
也是 java 中唯一的三目运算符。

注意:表达式 2 和表达式 3 的结果需要是同类型的,除非是能发生隐式类型转换

int a1 = 1;
int b1 = 2;
double c1 = a1 > b1? a1 : 2.0;
//int c2 = a1 > b1? a1 : 2.0;
// error 因为2.0是double,不能隐式转换到int类型

8、运算符的优先级

在Java中涉及了很多的运算符,每一种运算符都有各自的优先级。但是这些优先级不需要记忆。

咱们只要知道其中一点:小括号优先于所有。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

服务器配置-从0到分析4:ssh免密登入

该部分涉及到公钥、私钥等部分knowledge&#xff0c;本人仅作尝试 若将本地机器 SSH Key 的公钥放到远程主机&#xff0c;就能无需密码直接远程登录远程主机 1&#xff0c;在客户端生成 ssh 公私钥&#xff1a; 也就是我们本地机器&#xff0c;windows电脑 一路回车即可&am…

端到端自动驾驶——cnn网络搭建

论文参考&#xff1a;https://arxiv.org/abs/1604.07316 demo 今天主要来看一个如何通过图像直接到控制的自动驾驶端到端的项目&#xff0c;首先需要配置好我的仿真环境&#xff0c;下载软件udacity&#xff1a; https://d17h27t6h515a5.cloudfront.net/topher/2016/November…

SQL-labs13-16闯关记录

http://127.0.0.1/sqli-labs/less-13/ 基于POST单引号双注入变形 1&#xff0c;依然是一个登录框&#xff0c;POST型SQL注入 2&#xff0c;挂上burpsuite&#xff0c;然后抓取请求&#xff0c;构造请求判断漏洞类型和闭合条件 admin 发生了报错&#xff0c;根据提示闭合方式是(…

2025年渗透测试面试题总结- 阿某云安全实习(题目+回答)

网络安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 阿里云安全实习 一、代码审计经验与思路 二、越权漏洞原理与审计要点 三、SSRF漏洞解析与防御 四、教…

Zookeeper 及 基于ZooKeeper实现的分布式锁

1 ZooKeeper 1.1 ZooKeeper 介绍 ZooKeeper是一个开源的分布式协调服务&#xff0c;它的设计目标是将那些复杂且容易出错的分布式一致性服务封装起来&#xff0c;构成一个高效可靠的原语集&#xff0c;并以一系列简单易用的接口提供给用户使用。 原语&#xff1a;操作系统或…

开放鸿蒙OpenHarmony 5.0.0 Release 兼容性测试实战经验分享

OpenHarmony 5.0版本的发布时间是2024年12月20日至21日。这个版本带来了许多新特性和改进。现在5.0出了两个release 版本&#xff0c;分别是5.0.0和5.0.1。 就在5.0版本发布不到2周的时间内&#xff0c;2025年01月01日起&#xff0c;不支持新产品基于老分支&#xff08;OpenHar…

DeepSeek开源周Day6:DeepSeek V3、R1 推理系统深度解析,技术突破与行业启示

DeepSeek 在开源周第六天再次发文&#xff0c;中文原文、官方号在知乎 DeepSeek - 知乎DeepSeek-V3 / R1 推理系统概览 - 知乎deepseek-ai/open-infra-index: Production-tested AI infrastructure tools for efficient AGI development and community-driven innovation 引言 …

springBoot集成emqx 实现mqtt消息的发送订阅

介绍 我们可以想象这么一个场景&#xff0c;我们java应用想要采集到电表a的每小时的用电信息&#xff0c;我们怎么拿到电表的数据&#xff1f;一般我们会想 直接 java 后台发送请求给电表&#xff0c;然后让电表返回数据就可以了&#xff0c;事实上&#xff0c;我们java应用发…

Docker安装milvus及其基本使用说明

简介 Milvus 是一款开源的高性能、高可用的向量数据库&#xff0c;专为大规模机器学习和深度学习应用设计&#xff0c;旨在高效管理和检索高维向量数据。随着AI技术的飞速发展&#xff0c;向量数据库在图像识别、语音识别、自然语言处理、推荐系统等领域扮演着越来越重要的角色…

ssm_mysql_小型企业人事管理系统

收藏关注不迷路&#xff01;&#xff01; &#x1f31f;文末获取源码数据库&#x1f31f; 感兴趣的可以先收藏起来&#xff0c;还有大家在毕设选题&#xff08;免费咨询指导选题&#xff09;&#xff0c;项目以及论文编写等相关问题都可以给我留言咨询&#xff0c;希望帮助更多…

25年第四本【认知觉醒】

《认知觉醒》&#xff1a;一场与大脑的深度谈判 在信息爆炸的焦虑时代&#xff0c;我们像被抛入湍流的溺水者&#xff0c;拼命抓取各种自我提升的浮木&#xff0c;却在知识的漩涡中越陷越深。这不是一本简单的成功学指南&#xff0c;而是一场关于人类认知系统的深度对话&#…

盘古信息携手艾罗能源启动IMS数字化智能制造工厂项目,共筑新能源行业数字化标杆

在政策扶持下成长的新能源行业&#xff0c;如今已逐步进入商业化阶段。相比传统制造行业&#xff0c;新能源行业离散度高、自动化程度高。 面对迅疾的市场变化&#xff0c;在大环境中一枝独秀的新能源行业&#xff0c;亟需突破传统架构的限制&#xff0c;通过构建智能化生产体…

32.C++二叉树进阶1(二叉搜索树)

⭐上篇文章&#xff1a;31.C多态4&#xff08;静态多态&#xff0c;动态多态&#xff0c;虚函数表的存储位置&#xff09;-CSDN博客 ⭐本篇代码&#xff1a;c学习/18.二叉树进阶-二叉搜索树 橘子真甜/c-learning-of-yzc - 码云 - 开源中国 (gitee.com) ⭐标⭐是比较重要的部分…

图论基础算法: 二分图的判定(C++)

二分图的基本概念 什么是二分图? 二分图(Bipartite Graph)是指一个图的顶点集可以被分割为两个互不相交的子集 U U U 和 V V V, 并且图中的每一条边都连接 U U U 中的一个顶点和 V V V 中的一个顶点. 换句话说, 二分图中的顶点可以被分成两组, 组内的顶点之间没有边相连…

pyside6学习专栏(九):在PySide6中使用PySide6.QtCharts绘制6种不同的图表的示例代码

PySide6的QtCharts类支持绘制各种型状的图表&#xff0c;如面积区域图、饼状图、折线图、直方图、线条曲线图、离散点图等&#xff0c;下面的代码是采用示例数据绘制这6种图表的示例代码,并可实现动画显示效果&#xff0c;实际使用时参照代码中示例数据的格式将实际数据替换即可…

爬虫逆向实战小记——解决webpack实记

注意&#xff01;&#xff01;&#xff01;&#xff01;某XX网站实例仅作为学习案例&#xff0c;禁止其他个人以及团体做谋利用途&#xff01;&#xff01;&#xff01; aHR0cHM6Ly9wbW9zLnhqLnNnY2MuY29tLmNuOjIwMDgwL3B4Zi1zZXR0bGVtZW50LW91dG5ldHB1Yi8jL3B4Zi1zZXR0bGVtZW5…

Hive-优化(语法优化篇)

列裁剪与分区裁剪 在生产环境中&#xff0c;会面临列很多或者数据量很大时&#xff0c;如果使用select * 或者不指定分区进行全列或者全表扫描时效率很低。Hive在读取数据时&#xff0c;可以只读取查询中所需要的列&#xff0c;忽视其他的列&#xff0c;这样做可以节省读取开销…

【三维生成】StarGen:基于视频扩散模型的可扩展的时空自回归场景生成

标题&#xff1a;《StarGen: A Spatiotemporal Autoregression Framework with Video Diffusion Model for Scalable and Controllable Scene Generation》 项目&#xff1a;https://zju3dv.github.io/StarGen 来源&#xff1a;商汤科技、浙大CAD、Tetras.AI 文章目录 摘要一、…

vue2(笔记)4.0vueRouter.声明式/编程式导航以及跳转传参.重定向

---vueRouter 五个步骤: 两个核心: {path:路径,component:组件} 二级路由: 1.在主页路由对象中,添加children配置项 2.准备路由出口 示例代码: {path: /,component: layout,redirect: home,children: [{path: /home,component: home},{path: /card,component: card}]}, 在l…

内网渗透信息收集linuxkali扫描ip段,收集脚本(web安全)

内网ip段扫描↓ 工具1↓ nmap -sn 192.168.128.0/24工具2↓ nbtscan 192.168.128.0/24 工具↓3 arp-scan -t 1000 192.168.128.0/24 cmd命令扫描↓ for /L %I in (1,1,255) Do ping -w 1 -n 1 192.168.128.%I | findstr "TTL" 这个命令在Windows命令提示符下使…