【JavaSE-3】运算符

news2025/3/6 23:45:15

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中涉及了很多的运算符,每一种运算符都有各自的优先级。但是这些优先级不需要记忆。

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

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

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

相关文章

直接法估计相机位姿

引入 在前面的文章&#xff1a;运动跟踪——Lucas-Kanade光流中&#xff0c;我们了解到特征点法存在一些缺陷&#xff0c;并且用光流法追踪像素点的运动来替代特征点法进行特征点匹配的过程来解决这些缺陷。而这篇文章要介绍的直接法则是通过计算特征点在下一时刻图像中的位置…

VS2022C#windows窗体应用程序调用DeepSeek API

目录 一、创建DeepSeek API Key 二、创建窗体应用程序 三、设计窗体 1、控件拖放布局‌‌ 2、主窗体【Form1】设计 3、多行文本框【tbContent】 4、提交按钮【btnSubmit】 5、单行文字框 四、撰写程序 五、完整代码 六、运行效果 七、其它 一、创建DeepSeek API Ke…

kettle插件-高性能插入更新插件Upsert

场景&#xff1a;假如T日需要将a表中T-1日的数据同步到b表。由于某种业务需求a表中已经同步到b表中的数据发生了变化需要重新同步&#xff0c;这个时候就会用到插入更新插件&#xff0c;也就是 说a表中数据重新同步b表&#xff0c;若b表中存在此数据&#xff08;根据唯一id&am…

本地部署Qwen2.5-VL-7B-Instruct模型

本地部署Qwen2.5-VL-7B-Instruct模型 本地部署Permalink **创建环境** conda create -n qwenvl python3.11 -y# 报错&#xff1a; Solving environment: failedPackagesNotFoundError: The following packages are not available from current channels:# 处理&#xff1a; c…

【C++学习篇】智能指针

目录 1. 智能指针的使用场景分析 2. RAII和智能指针的设计思路 3. C标准库智能指针的使用 4.shared_ptr和weak_ptr 4.1shared_ptr的循环引用问题 4.2 weak_ptr 1. 智能指针的使用场景分析 下⾯程序中我们可以看到&#xff0c;new了以后&#xff0c;我们也delete了&#xff0c…

决策树(Decision Tree)基础知识

目录 一、回忆1、*机器学习的三要素&#xff1a;1&#xff09;*函数族2&#xff09;*目标函数2.1&#xff09;*模型的其他复杂度参数 3&#xff09;*优化算法 2、*前处理/后处理1&#xff09;前处理&#xff1a;特征工程2&#xff09;后处理&#xff1a;模型选择和模型评估 3、…

Excel基础(详细篇):总结易忽视的知识点,有用的细节操作

目录 写在前面基础篇Excel主要功能必会快捷键快捷键整理表LotusExcel的文件类型工作表基本操作表项操作选中与缩放边框线 自动添加边框线格式刷设置斜线表头双/多斜线表头不变形的:双/多斜线表头插入多行、多列单元格/行列的移动冻结窗口 方便查看数据打印的常见问题Excel格式…

Linux下学【MySQL】中如何实现:多表查询(配sql+实操图+案例巩固 通俗易懂版~)

每日激励&#xff1a;“不设限和自我肯定的心态&#xff1a;I can do all things。 — Stephen Curry” 绪论&#xff1a; 本章是MySQL篇中&#xff0c;非常实用性的篇章&#xff0c;相信在实际工作中对于表的查询&#xff0c;很多时候会涉及多表的查询&#xff0c;在多表查询的…

非平稳时间序列分析(三)——季节模型(SARIMA、STL、Holt-Winters)

此前篇章&#xff08;平稳序列&#xff09;&#xff1a; 时间序列分析&#xff08;一&#xff09;——基础概念篇 时间序列分析&#xff08;二&#xff09;——平稳性检验 时间序列分析&#xff08;三&#xff09;——白噪声检验 时间序列分析&#xff08;四&#xff09;—…

【web前端开发】CSS--CSS简介及其编写位置(上)

1、CSS简介 &#xff08;1&#xff09;CSS的全称为&#xff1a;层叠式样式表&#xff08;Cascading Style Sheets&#xff09; &#xff08;2&#xff09;CSS也是一种标记语言&#xff0c;用于给HTML结构设置样式&#xff0c;例如&#xff1a;文字大小、颜色、元素宽度等等…

云原生时代的技术桥梁

在数字化转型的大潮中&#xff0c;企业面临着数据孤岛、应用间集成复杂、高成本与低效率等问题。这些问题不仅阻碍了企业内部信息的流通和资源的共享&#xff0c;也影响了企业对外部市场变化的响应速度。当前&#xff0c;这一转型过程从IT角度来看&#xff0c;已然迈入云原生时…

【数据结构】什么是栈||栈的经典应用||分治递归||斐波那契问题和归并算法||递归实现||顺序栈和链栈的区分

文章目录 &#x1f967;栈的初步理解&#xff1a;&#x1f967;易错&#xff1a;如何判断栈满&#x1f967;栈满理解&#x1f967;栈的基本运算&#x1f4da;栈操作的伪代码逻辑&#xff08;顺序和链栈&#xff09;&#x1f4d5;顺序栈运算实现&#xff1a;顺序栈的表示&#x…

雷池WAF的为什么选择基于Docker

Docker 是一种开源的容器化平台&#xff0c;可以帮助开发人员将应用程序及其所有依赖项打包到一个称为容器的独立、可移植的环境中。Docker 的核心概念包括以下几点&#xff1a; 容器&#xff1a;Docker 使用容器来封装应用程序及其依赖项&#xff0c;使其能够在任何环境中都能…

Ubuntu20.04双系统安装及软件安装(七):Anaconda3

Ubuntu20.04双系统安装及软件安装&#xff08;七&#xff09;&#xff1a;Anaconda3 打开Anaconda官网&#xff0c;在右侧处填写邮箱&#xff08;要真实有效&#xff01;&#xff09;&#xff0c;然后Submit。会出现如图示的Success界面。 进入填写的邮箱&#xff0c;有一封Ana…

文件上传漏洞:upload-labs靶场11-20

目录 pass-11 pass-12 pass-13 pass-14 pass-15 pass-16 pass-17 pass-18 pass-19 pass-20 pass-11 分析源代码 &#xff0c;发现上传文件的存放路径可控 if(isset($_POST[submit])){$ext_arr array(jpg,png,gif);$file_ext substr($_FILES[upload_file][name],st…

HTTP协议(20250305)

1. 万维网 WWW(World Wide Web)世界范围内的&#xff0c;联机式的信息储藏所&#xff0c;万维网解决了获取互联网上的数据时需要解决的以下问题&#xff1a; 怎样标识分布在整个互联网上的文档 URL用什么样的协议实现万维网上的各种链接 HTTP怎么使用户能够方便的查看文档数…

Qt中txt文件输出为PDF格式

main.cpp PdfReportGenerator pdfReportGenerator;// 加载中文字体if (QFontDatabase::addApplicationFont(":/new/prefix1/simsun.ttf") -1) {QMessageBox::warning(nullptr, "警告", "无法加载中文字体");}// 解析日志文件QVector<LogEntr…

FPGA 高速接口Aurora8B/10B 协议详解与仿真

FPGA 高速接口Aurora8B/10B 协议详解与IP仿真 1 摘要 Aurora 8B/10B 是一种用于高速串行通信的协议&#xff0c;通常用于 FPGA 设计和其他数字通信应用。即一种编码方案&#xff0c;旨在在传输数据时提供可靠性、时钟恢复和错误检测。主要用于在点对点串行链路间移动数据的可…

【手撕算法】支持向量机(SVM)从入门到实战:数学推导与核技巧揭秘

摘要 支持向量机&#xff08;SVM&#xff09;是机器学习中的经典算法&#xff01;本文将深入解析最大间隔分类原理&#xff0c;手撕对偶问题推导过程&#xff0c;并实战实现非线性分类与图像识别。文中附《统计学习公式手册》及SVM调参指南&#xff0c;助力你掌握这一核心算法…

AORO P9000 PRO三防平板携手RTK高精度定位,电力巡检效率倍增

电网系统覆盖幅员辽阔&#xff0c;每年因设备故障导致的巡检耗时超过百万工日。传统巡检模式受限于定位误差、设备防护不足和作业效率低下三大核心痛点&#xff0c;亟需智能化工具的突破性革新。为了满足这一需求&#xff0c;遨游通讯推出AORO P9000 PRO三防平板&#xff0c;以…