运 算 符

算术运算符

算术运算符包括:+-*/%++--

+

当左右两边都是数值型时,则做加法运算。

当左右两边有一方为字符串,则做拼接运算。任何一个 Java 对象都可以转换为字符串。

如果 + 作用于字符,就将字符转为整数进行计算。

程序示例:

public static void main(String[] args) {System.out.println(100 + 86);                // 186System.out.println("100" + 86);              // 10086System.out.println(100 + 3 + "Hello");       // 103HelloSystem.out.println("Hello" + 100 + 3);       // Hello1003System.out.println(3.7 + "hello");           // 3.7helloSystem.out.println("abc" + true);            // abctrueSystem.out.println('中' + "abc" + true);     // 中abctrueSystem.out.println('a' + 'b');               // 195System.out.println('a' + "b");               // ab
}

代码 System.out.println(100 + 3 + "Hello"); 中,加法从右到左依次进行。

程序示例:

public static void main(String[] args) {String s1 = "天龙八部";String s2 = "笑傲江湖";String s3 = s1 + s2;System.out.println(s3); // 天龙八部笑傲江湖char ch1 = '男';char ch2 = '女';// char ch3 = ch1 + ch2; // Type mismatch: cannot convert from int to charSystem.out.println(ch1 + ch2); // 52906double num1 = 123.56;double num2 = 100.11;double num3 = num1 + num2;System.out.println(num3); // 223.67000000000002
}

/

除法分为整数除法和浮点数除法。当两个操作数都是整数时,执行整数除法,否则执行浮点数除法。

两个整数相除,即便除不尽,小数部分也会直接丢弃而不是四舍五入。浮点数参与除法运算,即便数学上能除得尽,结果也是浮点数。

程序示例:

public static void main(String[] args) {// 两个整数相除,即便除不尽,小数部分也会直接丢弃而不是四舍五入System.out.println(10 / 4);         // 2double num1 = 10 / 4;int num2 = 10 / 4;System.out.println(num1);           // 2.0System.out.println(num2);           // 2// 浮点数参与除法运算,即便数学上能除得尽,结果也是浮点数System.out.println(8.0 / 4);        // 2.0double num3 = 8.0;int num4 = 4;double num5 = num3 / num4;System.out.println(num5);           // 2.0// int num6 = num3 / num4; // Type mismatch: cannot convert from double to int
}

整数被 0 除将产生一个异常,而浮点数被 0 除将会得到一个无穷大或 NaN 结果。

程序示例:

// 整数被 0 除将产生一个异常,而浮点数被 0 除将会得到一个无穷大或 NaN 结果
public class DivideDemo {public static void main(String[] args) {// System.out.println(10 / 0);  // Exception in thread "main" java.lang.ArithmeticException: / by zeroSystem.out.println(10.0 / 0);   // InfinitySystem.out.println(-10.0 / 0);  // -InfinitySystem.out.println(0.0 / 0);    // NaNSystem.out.println(-0.0 / 0);   // NaNSystem.out.println(0.0 / 0.0);  // NaNSystem.out.println(0 / 0.0);    // NaN}
}

%

% 作用于整数时,取模的结果的正负号和第一个运算数相同。

% 作用于整数时的结果根据公式计算:a % b = a - a / b * b

程序示例:

public static void main(String[] args) {System.out.println(10 % 3);         // 1System.out.println(-10 % 3);        // -1System.out.println(10 % (-3));      // 1 , -3 可以不要括号System.out.println(-10 % (-3));     // -1 , -3 可以不要括号
}

程序示例:

public static void main(String[] args) {int all_days = 59;int weeks = 59 / 7;int days = 59 % 7;System.out.println(all_days + " 天等于 " + weeks + " 星期 " + days + " 天.");  // 59 天等于 8 星期 3 天.
}

% 可以作用于浮点数。

如果 a % b 中的 a 是浮点数,那么 a % b = a - (int)a / b * b

程序示例:

System.out.println(-10.5 % 3); // -1.5
System.out.println(10.5 % -3); // 1.5
System.out.println(-10.4 % 3); // -1.4000000000000004 , 说明结果可能是一个近似值

++

语句 ++i;i++; 独立使用时,效果和 i = i + 1; 完全一致。

程序示例:

public class ArithmeticOperatorExcercise01 {public static void main(String[] args) {int i = 1;i = i++; // temp = i; i = i + 1; i = temp;System.out.println(i); // 1int j = 1;j = ++j; // j = j + 1; temp = j; j = temp;System.out.println(j); // 2}
}

很多程序员认为前缀和后缀这种行为容易让人困惑。在 Java 中,很少在表达式中使用 ++--

关系运算符

在这里插入图片描述

关系运算符也叫比较运算符。关系运算符组成的表达式叫做关系表达式。

关系运算符的结果都是 boolean 型,也就是要么是 true,要么是 false

关系表达式经常用在 if 结构的条件中或循环结构的条件中。

程序示例:

public static void main(String[] args) {int a = 9;int b = 8;boolean flag = a > b;System.out.println(flag);   // trueSystem.out.println(a < b);  // false// int c = a > b; // Type mismatch: cannot convert from boolean to int
}

逻辑运算符

在这里插入图片描述

逻辑运算符用于连接多个条件表达式。

逻辑运算符的运算结果也是 boolean 类型。

逻辑运算符可以分为两组:
短路与 &&,短路或 ||,取反 !
逻辑与 &,逻辑或 |,逻辑异或 ^

a & b:& 叫逻辑与,规则:当 a 和 b 同时为 true,则结果为 true,否则为 false。

a && b:&& 叫短路与,规则:当 a 和 b 同时为 true,则结果为 true,否则为 false。

a | b:| 叫逻辑或,规则:当 a 和 b 只要有一个为 true,则结果为 true,否则为 false。

a || b:|| 叫短路或,规则:当 a 和 b 只要有一个为 true,则结果为 true,否则为 false。

!a:! 叫取反,或者非运算。当 a 为 true,则结果为 false,当 a 为 false,则结果为 true。

a ^ b:^ 叫逻辑异或,当 a 和 b 不同时,则结果为 true,否则为 false。

区分逻辑与 & 和短路与 &&:仅当第一个条件为 false 时,这两个运算符有区别。当第一个条件为 false 时,整个表达式一定为 false,此时短路与 && 将不再执行第二个表达式,而逻辑与 & 将继续执行第二个表达式。实际使用中一般都用短路与,因为效率更高。

程序示例:

public static void main(String[] args) {int a = 10;int b = 1;if (a < 1 && ++b < 20) {        // 第一个条件为 false,第二个条件不执行System.out.println("OK");} else {System.out.println("NO");}System.out.println(b);          // 1if (a < 1 & ++b < 20) {         // 第一个条件为 false,第二个条件仍执行System.out.println("OK");} else {System.out.println("NO");}System.out.println(b);          // 2
}

区分逻辑或 | 和短路或 ||:仅当第一个条件为 true 时,两个运算符有区别。当第一个表达式为 true 时,整个表达式一定为 true,此时短路或 || 将不再执行第二个表达式,而逻辑或 | 将继续执行第二个表达式。实际使用中较多使用短路或,因为效率更高。

程序示例:

public static void main(String[] args) {int a = 1;int b = 10;if (a < 10 || ++b < 20) {           // 第一个条件为 true,第二个条件不执行System.out.println("OK");} else {System.out.println("NO");}System.out.println(b);              // 10if (a < 10 | ++b < 20) {            // 第一个条件为 true,第二个条件仍执行System.out.println("OK");} else {System.out.println("NO");}System.out.println(b);              // 11
}

程序示例:

public static void main(String[] args) {System.out.println(60 > 20);                // trueSystem.out.println(!(60 > 20));             // falseSystem.out.println((10 > 1) ^ (10 > 2));    // falseSystem.out.println((10 < 1) ^ (10 > 2));    // true
}

可以利用短路运算符来避免错误。例如,在下面的表达式中:

boolean b = x != 0 && 1 / x > x + y;  // no division by 0

如果 x 等于 0,那么第二部分就不会计算。因此,如果 x 为 0,也就不会计算 1 / x,就不会出现除以 0 的错误。

赋值运算符

赋值运算符分两类:

基本赋值运算符:=

复合赋值运算符:+=-=*=/=%=

自增,自减和复合赋值运算符会进行类型转换。

程序示例:

public class AssignOperator {public static void main(String[] args) {byte b = 2;// b = b + 2; // Type mismatch: cannot convert from int to byteb += 2; // 等价于 b = (byte)(b + 2)System.out.println(b); // 4// b = b + 1; // Type mismatch: cannot convert from int to byteb++; // 等价于 b = (byte)(b + 1);System.out.println(b); // 5}
}

在 Java 中,赋值是一个表达式(expression),也就是说,它有一个值,具体来讲就是所赋的那个值。可以使用这个值完成一些操作。

程序示例:

public class AssignOperatorDemo {public static void main(String[] args) {int x = 1;int y = x += 4;System.out.println(y);      // 5}
}

这种嵌套赋值很容易混淆,应当分别清楚地写出这些赋值:

程序示例:

public class AssignOperatorDemo {public static void main(String[] args) {int x = 1;x += 4;int y = x;System.out.println(y); // 5}
}

条件运算符

基本语法:条件表达式 ? 表达式1 : 表达式2

如果条件表达式结果为 true,则整个表达式的值为表达式 1 的值,否则整个表达式的值为表达式 2 的值。表达式 1 和表达式 2 只有一个会执行。

程序示例:

public static void main(String[] args) {int a = 10;int b = 99;System.out.println(a > b ? a++ : b++); // 99System.out.println(a); // 10System.out.println(b); // 100System.out.println(a < b ? ++a : ++b); // 11System.out.println(a); // 11System.out.println(b); // 100
}

表达式 1 和表达式 2 必须是可以赋给接收变量的类型或者可以进行自动类型转换的。

程序示例:

public static void main(String[] args) {int a = 10;int b = 20;int c = a > b ? a : b;System.out.println(c);    // 20// short d = a > b ? a : b; // Type mismatch: cannot convert from int to shortshort e = a > b ? (short) a : (short) b;System.out.println(e);    // 20short f = (short) (a > b ? a : b);  // 后面的三元运算符表达式要括起来,否则强制类型转换只对 a 起作用System.out.println(f);    // 20double g = a > b ? a : b; // 自动类型转换System.out.println(g);    // 20.0
}

三元运算符可以修改为 if - else 语句。

语句 int res = a > b ? a : b; 等价于:

if (a > b) {int res = a;
} else {int res = b;
}

程序示例:

// 求三个数中的最大值
public static void main(String[] args) {int a = 10, b = 20, c = 30;int tmp;/*方法1if (a > b) {tmp = a;} else {tmp = b;}if (tmp < c) {tmp = c;}*//*方法2,最推荐tmp = a > b ? a : b;tmp = tmp > c ? tmp : c;*/// 方法3tmp = (a > b ? a : b) > c ? (a > b ? a : b) : c;  // 30System.out.println(tmp);
}

位运算符

位运算符按位运算,也会对符号位起作用,是对补码进行操作的。

Java 中有 7 个位运算符:

&:按位与,两位全为 1 时,结果为 1,否则结果为 0。

|:按位或,两位只要有一个为 1,则结果为 1,否则结果为 0。

^:按位异或,两位不同时,即一个为 0 而另一个为 1 时,结果为 1,否则结果为 0。

~:按位取反,0 变为 1,1 变为 0。

>>:算术右移,低位溢出(溢出就是扔掉不要了),符号位不变,即用原来的符号位补现在的符号位,并用 0 补上溢出的其余数字位。右移一次就是除以 2,右移两次就是除两次 2。

<<:算术左移,符号位不变,低位补上 0。左移一次就是乘以 2,左移两次就是乘以 2 再乘以 2。

>>>:逻辑右移,也叫无符号右移,规则为:低位溢出,高位补 0,即不论正负,高位一律补 0。没有 <<<

程序示例:

public class BitOperator {public static void main(String[] args) {System.out.println(2 & 3); // 0010 & 0011 = 0010System.out.println(~-2);   // 1// -2 原码:10000000 00000000 00000000 00000010// -2 反码:11111111 11111111 11111111 11111101// -2 补码:11111111 11111111 11111111 11111110// ~-2 补码:00000000 00000000 00000000 00000001 ,最高位为0// ~-2 反码,原码与~-2补码相等,三码合一System.out.println(~2); // -3// 2的原码,反码,补码:     00000000 00000000 00000000 00000010// ~2的补码:             11111111 11111111 11111111 11111101 ,最高位为 1// ~2的反码(~2的补码减1): 11111111 11111111 11111111 11111100// ~2的原码:             10000000 00000000 000000000 00000011 ,等于十进制的 -3}
}

如果 n 是一个整数变量,而且 n 的二进制表示中从右边数第 4 位为 1,则 int fourthBitFromRight = (n & 0b1000) / 0b1000; 会返回 1,否则返回 0。利用并结合适当的 2 的幂,可以屏蔽其他位,而只留下其中的某一位。

需要建立位模式来完成位掩码时,>><< 运算符会很方便:

int fourthBitFromRight = (n & (1 << 3)) >> 3;

移位运算符的右操作数要完成模 32 的运算(除非左操作数是 long 类型,在这种情况下需要对右操作数完成模 64 运算)。

例如,1 << 35 的值等同于 1 << 38

在 C/C++ 中,不能保证 >> 是完成算术移位(扩展符号位)还是逻辑移位(填充 0)。实现者可以选择其中更高效的任何一种做法。这意味着 C/C++ 中的 >> 运算符对负数生成的结果可能会依赖于具体的实现。Java 则消除了这种不确定性。

运算符的优先级

[图片]

上一行优先级高于下一行。

只有单目运算符和赋值运算符是从右往左运算的。

与 C 或 C++ 不同,Java 不使用逗号运算符。不过,可以在 for 语句的第 1 和第 3 部分中使用逗号分隔表达式列表,也就是说 Java 中的逗号只作为分隔符而不是逗号运算符。

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

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

相关文章

.Net实现SCrypt Hash加密

方案1 &#xff08;加密后存储“算法设置”、“盐(随机值)”、“Hash值”&#xff0c;以“$”分隔&#xff09;&#xff1a; //Nuget引入SCrypt.NET库 using Org.BouncyCastle.Crypto.Generators; using Scrypt; using System; using System.Security.Cryptography; namespace …

8.让画面动起来

一、Unity Shader中的内置变量&#xff08;时间篇&#xff09; 动画效果往往都是把时间添加到一些变量的计算中&#xff0c;以便在时间变化的同时也可以随之变化。Unity shader提供了一系列关于时间的内置变量来允许我们方便地在Shader中访问运行时间&#xff0c;实现各种动画…

暴雨推出X705显示器:23.8英寸100Hz IPS屏

IT资讯 6月 7 日消息&#xff0c;日前&#xff0c;暴雨发布了一款 23.8 英寸 IPS 显示器&#xff0c;直屏、支持 100Hz 刷新率。 据官方介绍&#xff0c;X705 显示器分辨率为 19201080&#xff0c;亮度为 300 尼特&#xff08;典型值&#xff09;&#xff0c;对比度 1000:1&…

从Log4j和Fastjson RCE漏洞认识jndi注入

文章目录 前言JNDI注入基础介绍靶场搭建漏洞验证注入工具 log4j RCE漏洞分析漏洞靶场检测工具补丁绕过 Fastjson RCE漏洞分析漏洞靶场检测工具补丁绕过 总结 前言 接着前文的学习《Java反序列化漏洞与URLDNS利用链分析》&#xff0c;想了解为什么 Fastjson 反序列化漏洞的利用…

关于用宽带(拨号)连接VPN无法上网,但是wifi或者热点就可以的问题

参考链接&#xff1a;https://zhuanlan.zhihu.com/p/580929250https://zhuanlan.zhihu.com/p/580929250 https://blog.csdn.net/Yaoyao2024/article/details/132245249文章浏览阅读10w次&#xff0c;点赞161次&#xff0c;收藏515次。很多同学在学习访问学校提供的资源时或者一…

队列和栈的实现

文章目录 队列队列的定义队列常见的基本操作队列的顺序存储结构实现 栈栈的定义栈的常见基本操作栈的顺序存储实现 栈的链式存储实现 队列 队列的定义 队列&#xff08;queue&#xff09;是只允许在一端进行插入操作&#xff0c;而在另一端进行删除操作的线性表。队列是一种先…

Vitis HLS 学习笔记--聚合与解聚-AXI主接口

目录 1. 简介 2. 用法及语法 3. 详细解读 4. 总结 1. 简介 在使用 Vitis HLS 工具进行硬件设计时&#xff0c;如果你在接口上使用了结构体&#xff0c;工具会自动把结构体里的所有元素组合成一个整体。就像把一堆零件组装成一个玩具一样。这样做的好处是&#xff0c;数据可…

【西瓜书】大题

1.线性回归 思路&#xff1a;ywxb&#xff0c;w为一维数组&#xff0c;求均方误差MSE&#xff0c;对w和b分别求偏导为0得到关于w和b的闭式求解。预测第十年的代入ywxb求解即可。 2.查准率、查全率 思路&#xff1a;先计算每个算法测试结果的混淆矩阵&#xff0c;再根据混淆矩阵…

pyrouge(ROUGE-1.5.5)的安装步骤和使用说明(适用于Linux 系统)

摘要&#xff1a;本文讲解了如何配置和使用文本摘要的评价指标ROUGE(linux 系统)。 ✅ NLP 研 1 选手的学习笔记 简介&#xff1a;小王&#xff0c;NPU&#xff0c;2023级&#xff0c;计算机技术 研究方向&#xff1a;摘要生成、大语言模型生成 文章目录 一、为啥要写这篇博客&…

问题汇总:MPU6050(软件iic)

以下为个人问题汇总&#xff0c;排查点汇总可能大有缺陷&#xff0c;如有错误&#xff0c;欢迎指正。 排查点汇总 检查软件iic的时序操作用示波器或逻辑分析仪检查波形 无法使用逻辑分析仪进行I/O引脚波形分析 充当SDA、SCL的引脚要配置为推挽输出; 另外&#xff0c;逻辑分…

挑战绝对不可能:再证有长度不同的射线

黄小宁 一空间坐标系中有公共汽车A&#xff0c;A中各座位到司机处的距离h是随着座位的不同而不同的变数&#xff0c;例如5号座位到司机处的距离是h3&#xff0c;…h5&#xff0c;…。A移动了一段距离变为汽车B≌A&#xff0c;B中5号座位到司机处的距离h’h3&#xff0c;…h’h5…

LLVM Cpu0 新后端 系列课程总结

想好好熟悉一下llvm开发一个新后端都要干什么&#xff0c;于是参考了老师的系列文章&#xff1a; LLVM 后端实践笔记 代码在这里&#xff08;还没来得及准备&#xff0c;先用网盘暂存一下&#xff09;&#xff1a; 链接: https://pan.baidu.com/s/1yLAtXs9XwtyEzYSlDCSlqw?…

测试与开发

目录 按照测试目标分类 界面测试 功能测试 性能测试 可靠性测试 安全性测试 易用性测试 按照执行方式分类&#xff1a; 测试方法 白盒测试 语句覆盖 条件覆盖 判定条件覆盖 条件组合覆盖 路径覆盖 黑盒测试 灰盒测试 按照测试阶段分类 单元测试 集成测试 …

【iOS】界面推出的方法

【iOS】界面推出的方法 在学习过程中我们发现在iOS中有两种界面推出的方法&#xff1a;push 和 present这两种方法都可以用来推出一个新的界面 但是这两者是存在区别的 push 方法是通过 UINavigationController 进行导航,新的视图控制器会被压入导航栈中&#xff0c;可以跨级…

写给大数据开发,如何去掌握数据分析

这篇文章源于自己一个大数据开发&#xff0c;天天要做分析的事情&#xff0c;发现数据分析实在高大上很多&#xff0c;写代码和做汇报可真比不了。。。。 文章目录 1. 引言2. 数据分析的重要性2.1 技能对比2.2 业务理解的差距 3. 提升数据分析能力的方向4. 数据分析的系统过程4…

前端 JS 经典:Promise 详解

1. Promise 由来 在以前我们实现异步是用的回调函数&#xff0c;当一个异步请求需要依赖上一个异步请求返回的结果的时候&#xff0c;就会形成如下这种的调用结构。 请求1(function (结果1) {请求2(function (结果2) {请求3(function(结果3)) {请求4(function(结果4) {})}});…

Windows下载安装RabbitMQ客户端(2024最新篇)

文章目录 RabbitMQ认知RabbitMQ下载RabbitMQ安装 更多相关内容可查看 RabbitMQ认知 定义&#xff1a;RabbitMQ是一个消息中间件&#xff0c;它接受并转发消息。你可以把它当做一个快递站点&#xff0c;当你要发送一个包裹时&#xff0c;你把你的包裹放到快递站&#xff0c;快递…

免费!GPT-4o发布,实时语音视频丝滑交互

We’re announcing GPT-4o, our new flagship model that can reason across audio, vision, and text in real time. 5月14日凌晨&#xff0c;OpenAI召开了春季发布会&#xff0c;发布会上公布了新一代旗舰型生成式人工智能大模型【GPT-4o】&#xff0c;并表示该模型对所有免费…

JDBC简介以及快速入门

这些都是JDBC提供的API 简介 每一个数据库的底层细节都不一样 不可能用一套代码操作所有数据库 我们通过JDBC可以操作所有的数据库 JDBC是一套接口 我们自己定义了实现类 定义实现类 然后就能用Java操作自己的数据库了 MySQL对于JDBC的实现类 就是驱动 快速入门 创建新的项…

vscode copilot git commit 生成效果太差,用其他模型替换

问题 众所周知&#xff0c;copilot git commit 就像在随机生成 git commit 这种较为复杂的内容还是交给大模型做比较合适 方法 刚好&#xff0c;gitlens 最近开发了 AI commit的功能&#xff0c;其提供配置url api可以实现自定义模型 gitlens 只有3种模型可用&#xff1a…