Scala程序基本运算

47 阅读4分钟

算术运算符

1.短路是指什么意思?

2.scala中如何判断相等?

3.scala中有自增和自减吗?

4.&& 和 || 哪个的优先级高?

5.scala中如何处理浮点数的精度问题?

(一)运算符概述

运算符就一个特殊的符号,使用运算符可以将一个或多个操作数连成可执行的语句,用于实现不同的功能。

按照对数据操作的功能不同,我们可以把Scala运算符分为以下五大类。

· 算术运算符:只能用来做加、减、乘、除等算术运算。

· 关系运算符:用来对数值进行比较,比如>、<=、>=等。

· 逻辑运算符:包含逻辑与、逻辑或、逻辑非三种运算符,也是用于比较的。

· 位运算符:用于对二进制数的位进行左移、右移、取反等操作。

· 赋值运算符:用于将一个值进行赋值,例如=、+=、-=等。

(二)Scala的算术运算符

//算术运算符



//数据类型 7:Int
//        4:Int
//        7/4的结果是Int
println(7/4)
println(7%4)
println(7-4)
println(7+4)
println(7*4)

image.png

Scala中算术运算的本质总结如下:

· +相当于调用对应类型的+方法

· -相当于调用对应类型的-方法

· 相当于调用对应类型的方法

· /相当于调用对应类型的/方法

· %相当于调用对应类型的%方法

注:重点提示:7/4=1。

(三)Scala的关系运算符

关系运算符会得到Bool值。scala中的关系运算符如下:

== 等于

!= 不等于

》 大于

< 小于

》= 大于等于

<= 小于等于

//关系运算符< > >= <= == !=
//false ture
val a:Boolean = 3 > 2
println(7==4)//false
println(7>4)//ture
println(7!=4)//ture
println(7<4)//false
println(7>=4)//ture
println(7<=4)//false

image.png

(四)Scala的逻辑运算符

Scala中的逻辑运算跟Java中一样,也是与、或、非三种情况,具体如下。

· 与:&& 运算表达式有一个为假,则整个表达式为假false。

· 或:|| 运算表达式有一个为真,则整个表达式为真true。

非:! 就是取反的意思,与参与表达式相反。

//逻辑运算符
/*
&&(并且)全部为true ===> true
||(或者)只有一个为true ===> true
!(取反)
 */

println( 3 > 3 && 3 > 4 )//false
println( 2 > 3 && 4 > 3 )//false
println( 1 > 2 && 2 > 1 )//false
println( 3 < 5 || 5 > 3 )//true
println( !(3>5) )//true

例如判断闰年如下图所示

image.png

代码

// 判断闰年
/*
1. 让用户输入一个整数,表示年份
2. 判断这个年份是否是闰年
3. 输出结果
*/

println("请输入一个年份:")
val year: Int = scala.io.StdIn.readLine().toInt

// 闰年判断规则:
// 1. 能被4整除但不能被100整除的是闰年
// 2. 能被400整除的是闰年
val result: Boolean =
  if (year % 400 == 0) true
  else if (year % 100 == 0) false
  else year % 4 == 0

if (result) {
  println(s"$year 是闰年")
} else {
  println(s"$year 不是闰年")
}

(六)Scala的赋值运算符

= 简单的赋值运算,指定将右边操作数赋值给左边的操作数

+= 相加后再赋值,将左右两边的操作数相加后再赋值给左边的操作数

-= 相减后再赋值,将左右两边的操作数相减后再赋值给左边的操作数

*= 相乘后再赋值,将左右两边的操作数相乘后再赋值给左边的操作数

/= 相除后再赋值,将左右两边的操作数相除后再赋值给左边的操作数

%= 求余后再赋值,将左右两边的操作数进行求余操作后再赋值给左边的操作数

例如

// 赋值运算符
var a = 1 // 把右边的计算结果保存到左边的变量
println(s"初始值: a = $a")

a += 2 // a += 2 等价于 a = a + 2
println(s"a += 2 后: a = $a") // 输出: 3

a -= 3 // a -= 3 等价于 a = a - 3
println(s"a -= 3 后: a = $a") // 输出: 0

a += 4 // 先加4,避免除0错误
println(s"a += 4 后: a = $a") // 输出: 4

a /= 2 // a /= 2 等价于 a = a / 2
println(s"a /= 2 后: a = $a") // 输出: 2

a *= 5 // a *= 5 等价于 a = a * 5
println(s"a *= 5 后: a = $a") // 输出: 10

// 其他赋值运算符示例
a %= 3 // a %= 3 等价于 a = a % 3
println(s"a %= 3 后: a = $a") // 输出: 1

image.png

(七)Scala的位运算符

常用的位运算符如下:

1. & 按位与运算符。0&1 = 0,  1&0= 0 , 0&0 = 0, 1&1 = 1

2. | 按位或运算符。0|1 = 1,  1|0= 1 , 0|0 = 0, 1|1 = 1

3. ^ 按位异或运算符。0^1 = 1,  1^1= 0, 0^0 = 0

4. ~ 按位取反运算符

5. << 左移运算符。右边补零,放大。

6. >> 右移运算符。左边补零,缩小。

// 位运算
println(5 & 4) // 按位与:5(101) & 4(100) = 4(100)
println(5 | 4) // 按位或:5(101) | 4(100) = 5(101)
println(4 << 2) // 左移2位:4(100) << 2 = 16(10000)
println(4 >> 2) // 右移2位:4(100) >> 2 = 1(1)
println(5 ^ 4) // 按位异或:5(101) ^ 4(100) = 1(001)
println(~5) // 按位取反:~5 = -6

image.png

(八)Scala中运算符的优先级

1. 乘(*)除(/)模(%) > 加(+)减(-)

2. 算术(+-*/%) > 关系(><>=!=) > 赋值(=)

3. && > ||

val result = 10 - 2 + 3 * 4 / 2  
println(result) // 问题1

val a = true  
val b = false  
val c = false  
println(a || b && c) // 问题2

(九)浮点数精度问题

解释:由于精度的问题,小数的计算会存在误差。

0.1 + 0.2 == 0.3 // false

解决方案:使用BigDecimal()函数。

println(0.1 + 0.2 == 0.3)  
    println(BigDecimal(0.1) + BigDecimal(0.2) == BigDecimal(0.3))