【JavaSE】运算符

news2024/11/18 22:42:07

运算符

  • BIT-3 运算符
    • 1. 什么是运算符
    • 2. 算数运算符
      • 2.1 基本四则运算符
      • 2.2 增量运算符
      • 2.3 自增/自减运算符
    • 3. 关系运算符
    • 4. 逻辑运算符(重点)
      • 4.1 逻辑与&&
      • 4.2 逻辑或||
      • 4.3 逻辑非!
      • 4.4 短路求值
    • 5. 位运算符
      • 5.1 按位与&
      • 5.2 按位或|
      • 5.3 按位取反~
      • 5.4 按位异或^
    • 6. 移位运算符(了解)
      • 6.1左移<<
      • 6.2右移>>
      • 6.3无符号右移>>>
    • 7. 条件运算符(三目运算符)
    • 8. 运算符的优先级

BIT-3 运算符

【本节目标】

熟练掌握各种运算符

1. 什么是运算符

计算机的最基本的用途之一就是执行数学运算,比如:

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

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

作为一门计算机语言,Java也提供了一套丰富的运算符来操纵变量。Java中运算符可分为以下:算术运算符(+ - * /)、关系运算符(< > ==)、逻辑运算符、位运算符、移位运算符以及条件运算符等。

表达式:运算符和运算对象组成的,单独的一个运算对象(常量/变量)也可以叫做表达式

2. 算数运算符

2.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)
  • % 不仅可以对整型取模,也可以对double类型取模,但是没有意义,一般都是对整型取模的
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.5);  //在Java里面是允许的
}
//--------------
//编译器运行结果为
//1
//1
//-1
//-1
//1.5
  • 两侧操作数类型不一致时,向类型大的提升
System.out.println(1+0.2);   // +的左侧是int,右侧是double,在加之前int被提升为double
// 故:输出1.2

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

但是和C语言不同的是

public static void main(String[] args) {
    short sh = 2;
    sh += 2;  //正确
    sh = sh + 2;  //error
}

这里sh是short类型,short类型和int类型进行加法运算,运算的结果为int类型,无法存储在short类型的变量sh中,如果想要正常使用必须进行强制类型转换。

然而sh += 2可以理解为帮助我们进行了类型的转换。

2.3 自增/自减运算符

自增自减运算符:++ --

++是给变量的值+1,–是给变量的值-1。

public static void main(String[] args) {
    int a =10;
    int b = a++; 
    //等价于b = a; a = a + 1;
    int c = ++a; 
    //等价于a = a + 1; c = a;
}
//--操作符与++操作符用法类似

注意:

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

3. 关系运算符

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

因为3 < a如果为真,返回true,true无法与5进行比较

4. 逻辑运算符(重点)

逻辑运算符主要有三个: && || ! ,运算结果都是 boolean类型。

4.1 逻辑与&&

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

两个表达式都为真,结果才是真,只要有一个是假,结果就是假。

特点:

  1. 如果表达式1为真,那么就去执行表达式2,如果表达式2也为真,那么整体为真。

  2. 如果表达式1为假,那么就不会执行表达式2

表达式1表达式2结果
truetruetrue
truefalsefalse
falsetruefalse
falsefalsefalse

代码示例

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

左右表达式必须是布尔表达式,C语言当中非0即真,0为假,但是Java当中true为真,false为假,所以左右表达式必须是布尔表达式

特点二

代码示例

public static void main(String[] args) {
    System.out.println(1/0);
}
//------------
//运行结果为
//Exception in thread "main" java.lang.ArithmeticException: / by zero
//	at Test.main(Test.java:10)

在我们的代码运行出现错误的时候,会报给我们异常情况,异常有很多种类

这个种类是算术异常java.lang.ArithmeticException

我们以后还会遇到空指针异常NullPointerException、不支持克隆异常……

image-20221104130716327

如果把这个算数异常用在逻辑与当中时

public static void main(String[] args) {
    int a = 1;
    int b = 2;

    System.out.println(a==2 && (1/0)==0);
}
//---------------
//编译器运行结果为
//false

这里的编译器没有报错,说明没有执行逻辑与中布尔表达式2语句,否则一定会报错。

public static void main(String[] args) {
    int a = 1;
    int b = 2;

    System.out.println(a==1 && (1/0)==0);
}
//-------------------
//编译器运行结果为
//Exception in thread "main" java.lang.ArithmeticException: / by zero
//	at Test.main(Test.java:22)

4.2 逻辑或||

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

两个表达式都为假,结果才是假,只要有一个是真,结果就是真。

特点:

  1. 如果表达式1为假,那么就去执行表达式2,如果表达式2也为假,那么整体为假。

  2. 如果表达式1为真,那么就不会执行表达式2。

表达式1表达式2结果
truetruetrue
truefalsetrue
falsetruetrue
falsefalsefalse

代码示例

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); //左为假 且 右为假 则结果为假

特点二代码示例

public static void main(String[] args) {
    int a = 1;
    int b = 2;

    System.out.println(a==1 || (1/0)==0);
}
//----------------
//编译器运行结果为
//true

表达式一为真,所以不执行表达式二。

public static void main(String[] args) {
    int a = 1;
    int b = 2;

    System.out.println(a==10 || (1/0)==0);
}
//--------------
//编译器运行结果为
//Exception in thread "main" java.lang.ArithmeticException: / by zero
//	at Test.main(Test.java:13)

表达式一为假,执行表达式二。

注意:左右表达式至少有一个为真,则结果为真

补充

表达式有很多种,布尔表达式只是其中一种。

4.3 逻辑非!

语法规则:! 布尔表达式

真变假,假变真。

表达式结果
truefalse
falsetrue

代码示例

public static void main(String[] args) {
    int a = 10;
    System.out.println(!(a == 10));
}

4.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 时, 也表示逻辑运算. 但与 && || 相比, 它们不支持短路求值.

表示逻辑运算

public static void main(String[] args) {
    int a = 1;
    int b = 2;
    System.out.println(a==1 & b==2);
    System.out.println(a==2 & b==2);
    System.out.println(a==2 | b==2);
    System.out.println(a==2 | b==1);
}
//--------------
//编译器运行结果为
//true
//false
//true
//false

不支持短路求值

System.out.println(10 > 20 & 10 / 0 == 0);       // 程序抛出异常
System.out.println(10 < 20 | 10 / 0 == 0);       // 程序抛出异常

5. 位运算符

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

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

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

5.1 按位与&

位运算规则:如果两个二进制位都是1,则结果为1,否则结果为0。

代码示例

public static void main(String[] args) {
    int a = 10;
    int b = 20;
    System.out.println(a & b);
}
//----------
//编译器运行结果为
//0

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

image-20221104153325958

所以10&20为0。

5.2 按位或|

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

代码示例

public static void main(String[] args) {
    int a = 10;
    int b = 20;
    System.out.println(a | b);
}
//------------
//编译器运行结果为
//30

image-20221104153520858

注意: 当 & 和 | 的操作数为整数(int, short, long, byte) 的时候, 表示按位运算, 当操作数为 boolean 的时候, 表示逻辑运算.

5.3 按位取反~

按位取反运算规则:如果该位为 0 则转为 1, 如果该位为 1 则转为 0。

public static void main(String[] args) {
    int a = 0xf;
    System.out.printf("%x\n", ~a);
}
//-------------
//编译器运行结果为
//fffffff0

注意:

  • 0x前缀的数字为 十六进制 数字. 十六进制可以看成是二进制的简化表示方式. 一个十六进制数字对应 4 个二进制位.
  • 0xf表示 10 进制的 15, 也就是二进制的 1111
  • printf能够格式化输出内容, %x 表示按照十六进制输出.
  • \n 表示换行符

5.4 按位异或^

运算规则:如果两个数字的二进制位相同, 则结果为 0, 相异则结果为 1.

特点:

  1. 两个相同的数字异或,结果是0
  2. 0 ^ x = x

目前知识储备不够,所以我们如果想要刷题,把知识学会,作业写了,等数据结构开始了陆续刷题。

等语法20节课上完就可以开始数据结构,年前可以学上八九成数据结构知识。

6. 移位运算符(了解)

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

正数左移

00000000 00000000 00000000 00001011
数值11
11<<1
00000000 00000000 00000000 00010110
变成22  11*2^1
11<<2
00000000 00000000 00000000 00101100
变成44  11*2^2

正数左移,向左移动,自动补0。

正数向左移动n个bit位就相当于扩大2的n次方倍。

正数右移

00000000 00000000 00000000 00001011
数值11
11>>1
00000000 00000000 00000000 00000101
数值5

正数右移,因为符号位上是0,所以自动补0。

负数右移

-1的原码形式
10000000 00000000 00000000 00000001
反码
11111111 11111111 11111111 11111110
补码
11111111 11111111 11111111 11111111
-1 >> 1
11111111 11111111 11111111 11111111

所以-1向右进行移位一个bit位还是自己本身。

6.1左移<<

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

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

注意:向左移位时,丢弃的是符号位,因此正数左移可能会变成负数。

6.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

6.3无符号右移>>>

Java当中又多了一个符号

>>>

无符号右移,最左侧统统补0。

注意:

  1. 正数左移 1 位, 相当于原数字 * 2. 左移 N 位, 相当于原数字 * 2 的N次方.

  2. 正数右移 1 位, 相当于原数字 / 2. 右移 N 位, 相当于原数字 / 2 的N次方.

  3. 由于计算机计算移位效率高于计算乘除, 当某个代码正好乘除 2 的N次方的时候可以用移位运算代替.

  4. 移动负数位或者移位位数过大都没有意义.

补充

存不存在无符号左移?

因为左移以后,右侧就是补0,所以不需要存在无符号左移。

7. 条件运算符(三目运算符)

条件运算符只有一个:

布尔表达式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; //error
  1. 表达式不能单独存在,其产生的结果必须要被使用。
int a = 10;
int b = 20; a > b? a : b;     // 报错:Error:(15, 14) java: 不是语句
  1. 正确写法
int a = 10;
int b = 20; 
int c = a > b? a : b;    

阿里笔试题

public static void main(String[] args) {
    System.out.println(true == true?true==true?false:true:true);
}
//-------------
//编译器运行结果为
//false

8. 运算符的优先级

在一条表达式中,各个运算符可以混合起来进行运算,但是运算符的优先级不同,比如:* 和 / 的优先级要高于 +-,有些情况下稍不注意,可能就会造成很大的麻烦。

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

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

注意:运算符之间是有优先级的. 具体的规则我们不必记忆. 在可能存在歧义的代码中加上括号即可。

运算符的知识就这么多,其实和c语言的知识相差不大,希望大家能够学会。

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

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

相关文章

【借助pf4j实现基于spring-boot的插件化开发

借助pf4j实现基于spring-boot的插件化开发背景场景项目地址&结构Demo运行背景 Jenkins、SonarQube等Java实现的Web应用都有插件体系&#xff0c;一般来说都是先从插件市场下载一个插件&#xff0c;然后系统要求重启(某些功能可以不用重启)&#xff0c;插件功能就能在页面上…

SRM-供应商管理系统搭建指南

1、简介1.1、案例简介本文将介绍&#xff0c;如何搭建SRM-供应商管理。1.2、应用场景供应商可注册、提交、修改自己的基本信息及工商信息&#xff0c;上传资质档案、管理产品及样品信息&#xff1b;企业对供应商是否成为合格供应商或淘汰供应商进行准入流程的审批。2、设置方法…

软件设计(四)--MTBF、MTTF、MTTR

软件设计&#xff08;三&#xff09;https://blog.csdn.net/ke1ying/article/details/128808681 31、结构化开发中&#xff0c;过程设计 主要包含对数据结构和算法的设计。 体系结构设计&#xff1a;定义软件的主要结构元素及其关系。 数据设计&#xff1a;基于实体联系图&a…

高压放大器在多波长干涉相位同步解调方法研究中的应用

实验名称&#xff1a;基于激光相位分立调制的多波长干涉相位同步解调方法研究 研究方向&#xff1a;激光测量 测试目的&#xff1a; 在长度测量中&#xff0c;绝对距离测量&#xff08;ADM&#xff09;可实现高精度、大范围和瞬时距离测量&#xff0c;与相对位移测量&#xff0…

Dynamsoft Barcode Reader 9.6.1 for NET Crack

Dynamsoft Barcode Reader以每分钟 500 的速度扫描条码 Dynamsoft Barcode Reader具有灵活 API 的强大条码扫描器 SDK Dynamsoft Barcode Reader无论它是模糊的、扭曲的、黑暗的、遥远的还是移动的&#xff0c;我们都可以扫描它。快速地。 业界最快扫描解码&#xff0c;适用于…

一次线上超时问题,看Ribbon 超时机制

一、线上问题 项目上线后&#xff0c;一段时间内运行都没有问题&#xff0c;突然运营人员说&#xff0c;某个接口一直失败。遂查看线上日志&#xff1a; spring-cloud-openfeign 通过服务名调用的&#xff0c;服务发现没有找到可用服务实例&#xff1f;这是第一反应&#xff0…

如何添加PDF书签?学会这三种方法

随着PDF文档和书籍已经成为我们工作和生活中不可或缺的一部分&#xff0c;许多PDF书签制作器和编辑器应运而生。了解使用 Windows、Mac 兼容或在线软件免费将书签添加到 PDF的多种方法。 什么是 PDF 书签&#xff1f; PDF 文件中的书签与印刷书籍中的纸质或织物书签的工作方式…

1609_PC汇编语言_汇编简介以及first例程后续

全部学习汇总&#xff1a; GreyZhang/g_unix: some basic learning about unix operating system. (github.com) 看了一下&#xff0c;当前看的这个章节还剩下几页没有看完。看完之后&#xff0c;做一个简单的整理。 在上一篇笔记中我提到了关于DJGPP的疑惑&#xff0c;也自己找…

RocketMQ源码-NameServer架构设计及启动流程

本文我们来分析NameServer相关代码&#xff0c;在正式分析源码前&#xff0c;我们先来回忆下NameServer的功能&#xff1a; NameServer是一个非常简单的Topic路由注册中心&#xff0c;其角色类似Dubbo中的zookeeper&#xff0c;支持Broker的动态注册与发现。主要包括两个功能&…

【每日阅读】前端进阶知识点1

如何更改网页中语言属性值 声明当前语言类 html标签更改属性值 lang属性中不区分大小写 en-us en-US 一致 具体可使用 window,document.querySelector(“html”)?.setAttribute(“lang”,newValue); qs库 qs是一个流行的查询参数序列化和解析库。可以将一个普通的object序列…

09_FreeRTOS任务调度器

目录 开启任务调度器vTaskStartScheduler函数 xPortStartScheduler开启任务调度器函数 启动第一个任务 prvStartFirstTask开启第一个任务函数 vPortSVCHandler SVC中断服务函数 出栈/压栈汇编指令详解 开启任务调度器vTaskStartScheduler函数 作用:用于启动任务调度器,…

LaoCat带你认识容器与镜像(实践篇一上)

实践篇主要以各容器的挂载和附加命令为主。 本章内容 Dockerfile基础命令详解。 本文实操全部基于Ubuntu 20.04 宿主机 > linux服务器本身 Docker > 20.10.22 从该章开始&#xff0c;我们就进入了Docker实践篇系列了&#xff0c;主要介绍Docker相关附加命令&#xff0c;…

Python中的字符串多样的操作方法

文章目录1.字符串中大小写字母的转变2.字符串的左右中对齐3.字符串查找的方法4.字符串的替换5. 字符串的判断6.字符串的截取7.字符串的拆分8.字符串的拼接9.格式化字符串10.格式化字符串的语法10.12.1 对齐选项&#xff08;[align]&#xff09;10.2 填充选项&#xff08;[fill]…

切入点(pointcut)的申明规则

Spring AOP 用户可能会经常使用 execution切入点指示符。执行表达式的格式如下&#xff1a;execution&#xff08;modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern&#xff08;param-pattern&#xff09; throws-pattern?&#xff09;ret-type-p…

HandlerInterceptorAdapter拦截器多个拦截器时执行的顺序

前提&#xff1a;拦截器加载顺序是 1 2 3.Configuration public class InterceptorConfig implements WebMvcConfigurer {Autowiredprivate Test1neInterceptor test1neInterceptor;Autowiredprivate Test2neInterceptor test2neInterceptor;Overridepublic void addIntercepto…

【Android -- 开源库】权限适配 RxPermissions 的基本使用

运行时权限 从 Android 6.0&#xff08;API 级别 23&#xff09;开始&#xff0c;用户开始在应用运行时向其授予权限&#xff0c;而不是在应用安装时授予。 系统权限分为两类&#xff1a; 正常权限&#xff1a;只需在你应用的 Androidmanifest.xml 中列出&#xff0c;安装时…

大数据---Hadoop安装教程(一)

Hadoop安装教程前期工作 以下步骤基于网络配置完成&#xff0c;并且能连接xshell和xftp工具 Linux安装: Linux—CentOS 7 64位安装教程 Xshell连接: Linux—Xshell连接 文章目录Hadoop安装教程前期工作安装vim编辑器免密登录ssh登录过程免密登录的原理操作1.免密登录2.开启远程…

比较排序——三路快速排序

快速排序&#xff08;Quicksort&#xff09;&#xff0c;计算机科学词汇&#xff0c;适用领域Pascal&#xff0c;c等语言&#xff0c;是对冒泡排序算法的一种改进。一、单路排序流程快速排序算法通过多次比较和交换来实现排序&#xff0c;其排序流程如下&#xff1a; (1)首先设…

e^(-x^2)的原函数(本求法为负面典型,仅供参考)

先放正确答案 ∫−∞∞e−x2π\int _{-\infin} ^{\infin} e^{-x^{2}}\sqrt{\pi}∫−∞∞​e−x2π​ 证法有许多 这是选自点我的一个证明方法。 首先要明确这是一个超越函数 求不了原函数 所以以下部分……纯属失败案例 注&#xff1a;原本在desmos上完成的推导&#xff0c;复制…

stable-diffusion-webui的基础功能手动安装,了解代码结构、依赖、模型出处

前言 虽然&#xff0c;当前有很多stable-diffusion-webui 的一键安装包&#xff0c;但是不易于彻底理解该项目 主要介绍了&#xff0c;手动安装 stable-diffusion-webui 基础功能的过程&#xff0c;手动安装&#xff0c;了解代码结构、依赖、模型出处 一、手动下载stable-dif…