Scala核心编程(三):运算符

Scala核心编程(三):运算符 一、运算符概述运算符是一种特殊的符号用以表示数据的运算、赋值和比较等操作。Scala中的运算符主要分为以下五大类序号运算符类型说明1算术运算符用于数值类型的加减乘除等运算2赋值运算符用于将运算结果赋值给变量3比较运算符关系运算符用于比较两个值的大小关系4逻辑运算符用于连接多个条件表达式5位运算符用于对二进制位进行操作二、算术运算符2.1 基本介绍算术运算符Arithmetic Operators是对数值类型的变量进行运算的在Scala程序中使用非常频繁。2.2 算术运算符一览表运算符运算范例结果正号33-负号b4; -b-4加5510-减6-42*乘3*412/除5/51%取模取余7%52字符串相加HelloHello2.3 代码案例演示objectOperatorDemo{defmain(args:Array[String]):Unit{// 整数除法只保留整数部分varr1:Int10/3println(r1r1)// 输出: r13// 注意即使赋值给Double整数除法结果仍是3.0varr2:Double10/3println(r2r2)// 输出: r23.0// 小数除法需要至少一个操作数为小数varr3:Double10.0/3println(r3r3)// 输出: r33.3333333333333335println(r3r3.formatted(%.2f))// 输出: r33.33// 取模运算println(10%3)// 输出: 1println(-10%3)// 输出: -1println(10%-3)// 输出: 1println(-10%-3)// 输出: -1}}2.4 重要细节说明⚠️ 细节1整数除法的陷阱对于除号/整数除和小数除是有区别的整数之间做除法时只保留整数部分而舍弃小数部分例如var x: Int 10/3结果是3⚠️ 细节2取模运算的本质当对一个数取模时可以等价于a % b a - a/b * b这样我们可以看到取模的一个本质运算和Java的取模规则一样。⚠️ 细节3Scala中没有、--操作符注意Scala中没有、--操作符需要通过、-来实现同样的效果varnum10// num // 编译错误Scala不支持num1// 正确num 11num-1// 正确num 102.5 课堂练习练习1假如还有97天放假问xx个星期零xx天valdays97valweeksdays/7// 13周valleftDaysdays%7// 余6天println(s$weeks个星期零$leftDays天)// 输出: 13 个星期零 6 天练习2华氏温度转摄氏温度公式为5/9*(华氏温度-100)测试数据232.5valfahrenheit232.5// 注意5/9在整数运算中结果为0需要使用5.0/9valcelsius5.0/9*(fahrenheit-100)println(s摄氏温度:$celsius)// 输出: 73.61111111111111三、关系运算符比较运算符3.1 基本介绍关系运算符的结果都是Boolean型也就是要么是true要么是false关系表达式经常用在if结构的条件中或循环结构的条件中关系运算符的使用和Java一样3.2 关系运算符一览表运算符运算范例结果相等于43false!不等于4!3true小于43false大于43true小于等于43false大于等于43true3.3 代码案例演示objectOperator02{defmain(args:Array[String]):Unit{vara9varb8println(ab)// trueprintln(ab)// trueprintln(ab)// falseprintln(ab)// falseprintln(ab)// falseprintln(a!b)// true// 可以将关系表达式的结果赋值给Boolean变量varflag:Booleanab println(flag)// true}}3.4 细节说明关系运算符的结果都是Boolean型也就是要么是true要么是false关系运算符组成的表达式我们称为关系表达式。如a b比较运算符不能误写成是赋值运算符使用陷阱如果两个浮点数进行比较应当保证数据类型一致四、逻辑运算符4.1 基本介绍用于连接多个条件一般来讲就是关系表达式最终的结果也是一个Boolean值。4.2 逻辑运算符一览表假设变量A为trueB为false运算符描述实例逻辑与(A B)运算结果为false||逻辑或(A || B)运算结果为true!逻辑非!(A B)运算结果为true4.3 代码案例演示objectLogicOperatorDemo{defmain(args:Array[String]):Unit{varatruevarbfalseprintln(a b (ab))// falseprintln(a || b (a||b))// trueprintln(!(a b) !(ab))// true// 短路运算示例varn5// 因为a为true所以不会执行后面的nprintln(a||(n0))// trueprintln(n n)// n 5n未执行}}五、赋值运算符5.1 基本介绍赋值运算符就是将某个运算后的值赋给指定的变量。5.2 赋值运算符分类简单赋值运算符运算符描述实例简单的赋值运算符C A B将A B表达式结果赋值给C复合赋值运算符运算符描述实例相加后再赋值C A等于C C A-相减后再赋值C - A等于C C - A*相乘后再赋值C * A等于C C * A/相除后再赋值C / A等于C C / A%求余后再赋值C % A等于C C % A左移后赋值C 2等于C C 2右移后赋值C 2等于C C 2按位与后赋值C 2等于C C 2^按位异或后赋值C ^ 2等于C C ^ 2|按位或后赋值C | 2等于C C | 2说明这部分的赋值运算涉及到二进制相关知识其运行的规则和Java一样。5.3 代码案例交换两个数的值objectSwapDemo{defmain(args:Array[String]):Unit{vara10varb99println(交换前: aa\tbb)// 使用中间变量交换valta ab bt println(交换后: aa\tbb)}}5.4 赋值运算符特点运算顺序从右往左赋值运算符的左边只能是变量右边可以是变量、表达式、常量值/字面量复合赋值运算符等价于下面的效果比如a 3等价于a a 35.5 面试题不用中间变量交换两个数objectInterviewSwap{defmain(args:Array[String]):Unit{vara10varb20// 方法1使用加减法可能溢出aab// a 30ba-b// b 10aa-b// a 20// 方法2使用异或运算推荐// a a ^ b// b a ^ b // b (a^b)^b a// a a ^ b // a (a^b)^a bprintln(aa, bb)}}六、位运算符6.1 位运算符一览表运算符描述实例按位与运算符(a b)输出结果 12二进制解释0000 1100|按位或运算符(a | b)输出结果 61二进制解释0011 1101^按位异或运算符(a ^ b)输出结果 49二进制解释0011 0001~按位取反运算符(~a)输出结果 -61二进制解释1100 0011在一个有符号二进制数的补码形式左移动运算符a 2输出结果 240二进制解释1111 0000右移动运算符a 2输出结果 15二进制解释0000 1111无符号右移a 2输出结果 15二进制解释0000 1111说明位运算符的规则和Java一样。6.2 代码示例objectBitwiseDemo{defmain(args:Array[String]):Unit{vala60// 0011 1100valb13// 0000 1101println(a b (ab))// 12 (0000 1100)println(a | b (a|b))// 61 (0011 1101)println(a ^ b (a^b))// 49 (0011 0001)println(~a (~a))// -61 (1100 0011)println(a 2 (a2))// 240 (1111 0000)println(a 2 (a2))// 15 (0000 1111)}}七、运算符的特别说明7.1 Scala不支持三目运算符Scala不支持三目运算符? :在Scala中使用if-else的方式实现// Java中的三目运算符// val num 5 4 ? 5 : 4 // Scala中没有这种写法// Scala中使用if-else实现valnumif(54)5else4println(num)// 输出: 5Scala的设计理念一种事情尽量只有一种方法完成这样可以让代码风格更加统一。7.2 课堂练习案例1求两个数的最大值vala10valb20valmaxif(ab)aelseb println(最大值: max)// 20案例2求三个数的最大值vala10valb20valc15valmaxif(ab){if(ac)aelsec}else{if(bc)belsec}println(最大值: max)// 20八、运算符优先级8.1 优先级规则运算符有不同的优先级所谓优先级就是表达式运算中的运算顺序。如下表上一行运算符总优先于下一行。只有单目运算符、赋值运算符是从右向左运算的。运算符的优先级和Java一样。8.2 运算符优先级表从高到低优先级类别运算符关联性1括号()[]左到右2单目运算!~右到左3算术运算符*/%左到右4算术运算符-左到右5移位运算左到右6比较运算符左到右7比较运算符!左到右8位运算左到右9位运算^左到右10位运算|左到右11逻辑运算左到右12逻辑运算||左到右13赋值运算-*/%^|右到左14逗号,左到右8.3 优先级记忆口诀1. () [] 2. 单目运算 3. 算术运算符 4. 移位运算 5. 比较运算符(关系运算符) 6. 位运算 7. 关系运算符 8. 赋值运算九、键盘输入语句9.1 基本介绍在编程中需要接收用户输入的数据就可以使用键盘输入语句来获取。9.2 Scala实现步骤导入该类所在的包import scala.io.StdIn直接调用StdIn对象的方法9.3 代码案例importscala.io.StdInobjectInputDemo{defmain(args:Array[String]):Unit{println(请输入姓名:)valnameStdIn.readLine()println(请输入年龄:)valageStdIn.readInt()println(请输入薪水:)valsalStdIn.readDouble()println(s姓名:$name, 年龄:$age, 薪水:$sal)}}9.4 与Java的对比功能Java实现Scala实现导入import java.util.Scanner;import scala.io.StdIn创建对象Scanner scanner new Scanner(System.in);无需创建对象读取字符串scanner.next();StdIn.readLine()读取整数scanner.nextInt();StdIn.readInt()读取小数scanner.nextDouble();StdIn.readDouble()Scala更简洁不需要创建Scanner对象直接调用StdIn的静态方法即可。十、本章总结10.1 重点回顾知识点关键内容算术运算符Scala没有、--使用、-替代关系运算符结果都是Boolean型不要写成逻辑运算符与、||或、!非支持短路运算赋值运算符复合赋值运算符如、*等运算顺序从右往左位运算符规则和Java完全一致三目运算符Scala不支持使用if-else替代运算符优先级和Java一样可用括号改变优先级键盘输入使用scala.io.StdIn比Java更简洁10.2 Scala vs Java 运算符对比特性ScalaJava/--❌ 不支持✅ 支持三目运算符? :❌ 不支持✅ 支持if-else返回值✅ 有返回值可替代三目❌ 无返回值键盘输入StdIn.readXxx()Scanner.nextXxx()运算符优先级与Java一致标准优先级十一、课后练习练习1判断闰年编写程序判断某一年是否为闰年能被4整除但不能被100整除或者能被400整除。valyear2024valisLeap(year%40year%100!0)||(year%4000)println(s$year是闰年吗?$isLeap)练习2不使用临时变量交换两个数vara10varb20aab ba-b aa-b println(sa$a, b$b)练习3计算BMI指数importscala.io.StdIn println(请输入身高(m):)valheightStdIn.readDouble()println(请输入体重(kg):)valweightStdIn.readDouble()valbmiweight/(height*height)valresultif(bmi18.5)偏瘦elseif(bmi24)正常elseif(bmi28)偏胖else肥胖println(sBMI:${bmi.formatted(%.2f)}, 结果:$result)如果本文对你有帮助欢迎点赞 、收藏 ⭐、评论 你的支持是我持续更新的动力