文章
时间轴
标签
音乐室
友人帐
一刻时光
清单
留言板
相册
算法海洋
关于
Slcpの童话镇 🏰
写文章
Java基础知识总结之运算符
原创
Java
后端
发布日期:
2019年03月17日
文章字数:
5.1k
阅读次数:
730
阅读时长:
0小时0分0秒
## 类型转换 在java中,一些数据类型是可以相互转换的,分为两种类型转换:`自动类型转换和强制类型转换`。 ### 自动类型转换(隐式转换) 把一个`取值范围小的变量赋值给取值范围大`的变量,这种方式是自动的,可以直接赋值。 ~~~java int a = 10; // 将int类型的a直接赋值给double类型的b double b = a; //输出10.0 ~~~ `注意:` * 在java中,整数类型`默认是int类型`,在`byte、short、char`进行运算的时候,会`先自动类型提升为int类型`,然后`再进行运算`。 ~~~java byte b1 = 10; byte b2 = 20; byte b3 = b1 + b2; // 第三行代码会报错,b1和b2会自动转换为int类型,计算结果为int,int赋值给byte需要强制类型转换。 // 修改为: int num = b1 + b2; // 或者: byte b3 = (byte) (b1 + b2); ~~~ * `boolean类型`不能与其他基本数据类型相互转换。 ### 强制类型转换 把一个`取值范围大的变量赋值给取值范围小`的变量。 强制类型转换格式: >目标数据类型 变量名 = (目标数据类型)值或者变量; 例如: ```java double a = 5.5; int b = (int) a; // 将double类型的a强制转换为int类型,会损失精度。 System.out.println(b); // 输出5(小数位直接舍弃) ``` `注意:` ```java byte a = 3; byte b = 4; byte c = a + b; //错误。因为两个byte变量相加,会先提升为int类型 byte d = 3 + 4; //正确。常量优化机制 ``` `常量优化机制`: 在编译时,整数常量的计算会直接算出结果,并且会自动判断该结果是否在byte取值范围内, 在:编译通过 不在:编译失败 `强制类型转换会损失精度,不建议使用。在后期,也会用的少。` ## 运算符 ### 运算符和表达式 运算符:`对常量或者变量进行操作的符号。` 表达式:用运算符将常量或者变量连接起来`符合java语法的式子`就可以称为表达式。 `不同运算符连接的表达式体现的是不同类型的表达式。` ### 算术运算符 算术运算符:+ 、- 、*、 / 、% | 符号 | 作用 | | ---- | ---- | | + | 加 | | - | 减 | | * | 乘 | | / | 除 | | % | 取余 | **注意事项:** `/与%的区别:`虽然都是除法运算,但/取结果的商,%取结果的余数。 整数操作只能得到整数,`如果想得到小数,那么必须有浮点数参与运算。` #### 字符的“+”操作 > `字符的本质就是数字` 可以通过IDEA工具查看反编译.class文件,会发现case后的字符串值是数字组成。在switch时,会详细说明。 char类型参与算术运算,`使用的是计算机底层对应的十进制数值`。需要我们记住三个字符对应的数值: `'a' -- 97` a-z是连续的,所以'b'对应的数值是98,'c'是99,依次递加 `'A' -- 65` A-Z是连续的,所以'B'对应的数值是66,'C'是67,依次递加 `'0' -- 48 ` 0-9是连续的,所以'1'对应的数值是49,'2'是50,依次递加 ~~~java // 可以通过使用字符与整数做算术运算,得出字符对应的数值是多少 char ch1 = 'a'; System.out.println(ch1 + 1); // 输出98,97 + 1 = 98 char ch2 = 'A'; System.out.println(ch2 + 1); // 输出66,65 + 1 = 66 char ch3 = '0'; System.out.println(ch3 + 1); // 输出49,48 + 1 = 49 ~~~ `算术表达式中包含不同的基本数据类型的值的时候,整个算术表达式的类型会自动进行提升。` 提升规则: `byte类型,short类型和char类型将被提升到int类型`,不管是否有其他类型参与运算。 整个表达式的类型自动提升到与表达式中最高等级的操作数相同的类型 等级顺序:`byte,short,char --> int --> long --> float --> double` 例如: ~~~java byte b1 = 10; byte b2 = 20; // byte b3 = b1 + b2; // 该行报错,因为byte类型参与算术运算会自动提示为int,int赋值给byte可能损失精度 int i3 = b1 + b2; // 应该使用int接收 byte b3 = (byte) (b1 + b2); // 或者将结果强制转换为byte类型 ------------------------------- int num1 = 10; double num2 = 20.0; double num3 = num1 + num2; // 使用double接收,因为num1会自动提升为double类型 ~~~ #### 字符串的“+”操作 当“+”操作中出现字符串时,这个`”+”是字符串连接符`,而不是算术运算。 ~~~java System.out.println("itheima"+ 666); // 输出:itheima666 ~~~ 在”+”操作中,如果出现了字符串,就是`连接运算符`,否则就是算术运算。当连续进行“+”操作时,从左到右逐个执行。 ~~~java System.out.println(1 + 99 + "年黑马"); // 输出:100年黑马 System.out.println(1 + 2 + "itheima" + 3 + 4); // 输出:3itheima34 // 可以使用小括号改变运算的优先级 System.out.println(1 + 2 + "itheima" + (3 + 4)); // 输出:3itheima7 ~~~ #### 数值拆分 需求: 键盘录入一个三位数,将其拆分为个位,十位,百位,打印在控制台 示例代码: ```java import java.util.Scanner; public class Test { public static void main(String[] args) { // 1:使用Scanner键盘录入一个三位数 Scanner sc = new Scanner(System.in); System.out.println("请输入一个三位数"); int num = sc.nextInt(); // 2:个位的计算:数值 % 10 int ge = num % 10; // 3:十位的计算:数值 / 10 % 10 int shi = num / 10 % 10; // 4:百位的计算:数值 / 100 int bai = num / 100; // 5:将个位, 十位, 百位拼接上正确的字符串, 打印即可 System.out.println("整数"+num+"个位为:" + ge); System.out.println("整数"+num+"十位为:" + shi); System.out.println("整数"+num+"百位为:" + bai); } } ``` ### 赋值运算符 赋值运算符的作用是将一个表达式的值赋给左边,左边必须是可修改的,不能是常量。 赋值运算符:= 、-= 、+= 、 /= 、 %= | 符号 | 作用 | 说明 | | :--- | ---------- | --------------------------------------- | | = | 赋值 | a = 1; 将1赋值给变量a,而不是变量a等于1. | | -= | 减后赋值 | a -= b; 将a - b 的结果赋值给a. | | += | 加后赋值 | a += b; 将a + b 的结果赋值给a. | | /= | 除后赋值 | a /= b; 将a / b 得到的商赋值给a. | | %= | 取后商赋值 | a %= b; 将a % b 得到的余数赋值给a. | **注意:** `扩展的赋值运算符隐含了强制类型转换。` ```java short s = 10; s = s + 10; // 此行代码报错,因为运算中s提升为int类型,运算结果int赋值给short可能损失精度 s += 10; // 此行代码没有问题,隐含了强制类型转换,相当于 s = (short) (s + 10); ``` ### 自增自减运算符 自增运算符:++ 自减运算符: -- | 符号 | 作用 | 说明 | | ---- | ---- | ----------- | | ++ | 自增 | 变量的值加1 | | -- | 自减 | 变量的值减1 | **注意事项:** 1. ++和--,既可以放到变量前,也可以放到变量后。 2. 单独使用的时候,++和--无论放到哪里,结果都一样。 3. 参与操作的时候,如果放到变量前,++和--是先计算后赋值,也就是先拿变量做++或者--,后拿变量参与操作。 ```java int a = 10,b = 0; b = ++a; //结果:a为11,b为11; int a = 10,b = 0; b = --a; //结果:a为9,b为9; ``` 4. 参与操作的时候,如果放到变量后,++和--是先赋值后计算。 ```java int a = 10,b = 0; b = a++; //结果:a为11,b为10; int a = 10,b = 0; b = a--; //结果:a为9,b为10; ``` `更深层次理解++或者--操作————3、4注意事项` ~~~java int a = 5; int b = (a++) + (++a) + a*10; System.out.println("a=" + a + ";b=" + b); //输出的结果为:a=7;b=82 //得出结论,参与操作的时候,如果放到变量后,本身一旦运行完,将会做++或者--操作。 int b =a*10 + 1 + (++a) + (a++); System.out.println("a=" + a + ";b=" + b); //输出的结果为:a=7;b=63 /* 结论:java代码的运行是按照先后顺序的,也就是说是以顺序结构进行运算的,从上到下,从左到右。 因此,++或者--必须是运算时才会进行相应的操作。 */ ~~~ **注意:** `()虽然优先级最高,但在计算机语言中()单对++或者--并没有什么用。++或者--是否进行运算是看它何时参与操作` ### 运算符的优先级 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200801123812785.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1N1bnNoaW5lX01yX1N1bg==,size_16,color_FFFFFF,t_70) ### 关系运算符(布尔运算符) 关系运算符:== 、<= 、>= 、< 、> 、!= | 符号 | 说明 | | ---- | ---------------------------------------------------- | | == | a == b,判断a和b是否相等,成立为true,不成立为false | | != | a != b,判断a和b是否不相等,成立为true,不成立为false | | >= | a >= b,判断a是否大于等于b,成立为true,不成立为false | | <= | a <= b,判断a是否小于等于b,成立为true,不成立为false | | < | a < b,判断a是否小于b,成立为true,不成立为false | | > | a > b,判断a是否大于b,成立为true,不成立为false | **注意事项:** 关系运算符结果都是`boolean类型`,要么是true,要么是false。 还有千万不要把 “==” 误写成 “=”。"=="是判断是否相等的关系,"="是赋值。 ### 逻辑运算符 逻辑运算符:& 、| 、! 、^ 、&& 、|| | 符号 | 作用 | 说明 | | ---- | -------- | ----------------------------------------------------------- | | & | 逻辑与 | a&b,a或者b只要有一个是flase,那么结果为flase,否则为true。 | | \| | 逻辑或 | a\|b,a或者b只要有一个是true,那么结果为true,否则为flase。 | | ! | 逻辑非 | !a, 如果a为true,那么!a则为flase,也就是说结果正好相反。 | | ^ | 逻辑异或 | a^b,a和b结果相同为flase,结果不同为true | 短路逻辑运算符:&& 、|| | 符号 | 作用 | 说明 | | ---- | ------ | -------------------------- | | && | 短路与 | 作用和&相同,但有短路效果 | | \|\| | 短路或 | 作用和\|相同,但有短路效果 | `在短路与计算中,只要有一个表达式为false,那么结果就会判断为false,因此就没必要继续进行下去,从而可以提高效率,同理短路或也是这种原理。` * 逻辑与(&),不管左边是true还是false,都会执行右边。 短路与(&&),如果左边为真,右边执行;如果左边为假,不再执行右边。 * 逻辑或(|),不管左边是true还是false,都会执行右边。 短路或(||),如果左边为假,右边执行;如果左边为真,不再执行右边。 ~~~java int x = 3; int y = 4; System.out.println((x++ > 4) & (y++ > 5)); // 两个表达都会运算 System.out.println(x); // 4 System.out.println(y); // 5 System.out.println((x++ > 4) && (y++ > 5)); // 左边已经可以确定结果为false,右边不参与运算 System.out.println(x); // 4 System.out.println(y); // 4 ~~~ ### ### 三元运算符 三元运算符语法格式: ~~~ java 关系表达式 ?表达式1:表达式2 ~~~ 计算规则: 1. 首先计算关系表达式。 2. 如果值为true,表达式1的值就是运算结果。 3. 如果值为false,表达式2的值就是运算结果。 ~~~java int a = 10, b = 20; boolean c = a > b ? a : b; //结果c为20 //补充:三元运算符是可以嵌套使用的 boolean c = a > b ? (a < b ? a : b) : b; ~~~ ### 三元运算符案例 需求: 一座寺庙里住着三个和尚,已知他们的身高分别为150cm、210cm、165cm,请用程序实现获取这三个和尚的最高身高。 使用三元运算符嵌套实现: ~~~java public class OperatorTest02 { public static void main(String[] args) { //1:定义三个变量用于保存和尚的身高,单位为cm,这里仅仅体现数值即可。 int height1 = 150; int height2 = 210; int height3 = 165; //2:用三元运算符嵌套,获取最大身高变量并保存。 int maxHeight = height1 > height2 ? height1 > height3 ? height1 : height3 : height2 > height3 ? height2 : height3 ; //3:输出结果 System.out.println("maxHeight:" + maxHeight); } } ~~~
您阅读这篇文章共耗时:
0小时16分34秒
文章链接:
https://www.slcp.top/article/read/16
版权声明:
本博客所有文章除特別声明外,均采用
CC BY 4.0
许可协议。转载请注明来源
Slcp
!
转载文章以及部分引用均为自己整理记录学习而用,若有侵权,请联系删除。
Java
评论
Valine
Gitalk
目录
搜索
首页
前进
后退
刷新
申请友链
在线联系