《Kotlin进化之路》之【第二章:揭开Kotlin的基础面纱】(三)

2.2 运算符

2.2.1:算术运算符

算术运算符用在数学表达式中,它们的作用和在数学中的作用一样。下表列出了所有的算术运算符。

举例2.2.1.1:设置两个变量,a=3,b=2,如下表:

操作符

描述

举例

+

加法 - 相加运算符两侧的值

a + b 等于 5

-

减法 - 左操作数减去右操作数

a - b 等于 1

*

乘法 - 相乘操作符两侧的值

a * b 等于 6

/

除法 - 左操作数除以右操作数

a / b 等于 1

%

取模 - 左操作数除以右操作数的余数

a %b 等于 1

++

自增: 操作数的值增加1(

注意:++在前,先相加再运算,++在后先运算后相加)

a++ = 3

++a=4

--

自减: 操作数的值减少1(

--在前先相减再运算,--在后先运算后相减)

a-- = 3

--a = 2

代码演示(和表内举例不同):

fun main(args: Array<String>) {
    var a:Int = 3
    var b:Int = 2

    println("a+b = "+(a+b))
    println("a-b = "+(a-b))
    println("a*b = "+(a*b))
    println("a/b = "+(a/b))
    println("a%b = "+(a%b))
    println("a++ = "+(a++))
    println("a = "+a)
    println("++b = "+(++b))
    println("a-- = "+(a--))
    println("a = "+a)
    println("--b = "+(--b))
}

 打印结果:

a+b = 5
a-b = 1
a*b = 6
a/b = 1
a%b = 1
a++ = 3
a = 4
++b = 3
a-- = 4
a = 3
--b = 2

 需要解释的是,a/b,是取得商,a%b是取得余数,a++,下一次运算a时才会计算,同样a—也是。

2.2.2:关系运算符

关系运算,学习过其它高级语言的都会多多少少了解到,无非就是大于小于等于之类的,我们看下Kotin关系运算都包含哪些,设置a=3,b=2如下表:

运算符

描述

举例

==

检查如果两个操作数的值是否相等,如果相等则条件为真

(a == b)为假(非真)

!=

检查如果两个操作数的值是否相等,如果值不相等则条件为真

(a != b) 为真

>

检查左操作数的值是否大于右操作数的值,如果是那么条件为真

(a> b)为真

<

检查左操作数的值是否小于右操作数的值,如果是那么条件为真

(a < b)为假

>=

检查左操作数的值是否大于或等于右操作数的值,如果是那么条件为真

(a> = b)为真

<=

检查左操作数的值是否小于或等于右操作数的值,如果是那么条件为真

(a <= b)为假

 代码演示:

fun main(args: Array<String>) {
    var a:Int = 3
    var b:Int = 2

    println(a==b)
    println(a!=b)
    println(a>b)
    println(a<b)
    println(a>=b)
    println(a<=b)
}

打印结果:

false
true
true
false
true
false

2.2.3:逻辑运算符

Kotlin的逻辑运算符和Java语言类似,比如我们设置布尔变量a为真,变量b为假,总结可以看下表:

操作符

描述

举例

&&

称为逻辑与运算符。当且仅当两个操作数都为真,条件才为真

(a && b)为假

||

称为逻辑或操作符。如果任何两个操作数任何一个为真,条件为真

(a || b)为真

!

称为逻辑非运算符。用来反转操作数的逻辑状态。如果条件为true,则逻辑非运算符将得到false

!(a &&b)为真

代码演示:

fun main(args: Array<String>) {
  var a: Boolean = true
  var b: Boolean = false

  println(a&&b)
  println(a||b)
  println(!(a && b))
}

打印结果:

false
true
true

2.2.4:赋值运算符

Kotlin赋值运算符和Java也基本类似,但比Java要少些,具体请看下表:

操作符

描述

举例

=

简单的赋值运算符,将右操作数的值赋给左侧操作数

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

代码演示:

fun main(args: Array<String>) {
  var a:Int = 3
  var b:Int = 2
  var c:Int = 1

  c=a+b
  println(c)//输出结果为 5
  c+=a      //=>c=c+a => c = 5 + 3 输出结果为8
  println(c)
  c-=a      //=>c=c-a => c = 8 - 3 输出结果为5
  println(c)
  c*=a      //=>c=c*a => c = 5 * 3 输出结果为15
  println(c)
  c/=a      //=>c=c/a => c = 15 / 3 输出结果为5
  println(c)
  c%=a      //=>c=c%a => c = 5 % 3 输出结果为2
  println(c)
}

打印结果:

5
8
5
15
5
2

 2.2.5:位运算符

Kotlin中对于按位操作,和Java是有很大的差别的,Kotlin中没有特殊的字符,但是只能命名为可以以中缀形式调用的函数,下列是按位操作的完整列表(仅适用于整形(Int)和长整形(Long)):

Ø shl(bits) => 有符号向左移 (类似Java的<<)

Ø shr(bits) => 有符号向右移 (类似Java的>>)

Ø ushr(bits) => 无符号向右移 (类似Java的>>>)

Ø and(bits) => 位运算符 and (同Java中的按位与)

Ø or(bits) => 位运算符 or (同Java中的按位或)

Ø xor(bits) => 位运算符 xor (同Java中的按位异或)

Ø inv() => 位运算符 按位取反 (同Java中的按位取反)

下面附上Kotlin中关于位操作符的源码:

/** Shifts this value left by [bits]. */
public infix fun shl(bitCount: Int): Int
/** Shifts this value right by [bits], filling the leftmost bits with copies of the sign bit. */
public infix fun shr(bitCount: Int): Int
/** Shifts this value right by [bits], filling the leftmost bits with zeros. */
public infix fun ushr(bitCount: Int): Int
/** Performs a bitwise AND operation between the two values. */
public infix fun and(other: Int): Int
/** Performs a bitwise OR operation between the two values. */
public infix fun or(other: Int): Int
/** Performs a bitwise XOR operation between the two values. */
public infix fun xor(other: Int): Int
/** Inverts the bits in this value. */
public fun inv(): Int

代码演示:

fun main(args: Array<String>) {
  var a: Int = 8
  var shla = a shl(2)
  var shra = a shr(2)
  var ushra = a ushr(2)
  var anda = a and(2)
  var ora = a or(2)
  var xora = a xor(2)
  var inva = a.inv()

  println("shla => $shla \n " +
          "shra => $shra \n " +
          "ushra => $ushra \n " +
          "anda => $anda \n " +
          "ora => $ora \n " +
          "xora => $xora \n " +
          "inva => $inva")
}

 打印结果:

shla => 32
shra => 2
ushra => 2
anda => 0
ora => 10
xora => 10
inva => -9

2.2.6:运算符优先级

当多个运算符出现在一个表达式中,谁先谁后呢?这就涉及到运算符的优先级别的问题,在一个多运算符的表达式中,运算符优先级不同会导致最后得出的结果差别甚大。

例如,(1+3)+(3+2)*2,这个表达式如果按加号最优先计算,答案就是 18,如果按照乘号最优先,答案则是 14。

再如,x = 7 + 3 * 2;这里x得到13,而不是20,因为乘法运算符比加法运算符有较高的优先级,所以先计算3 * 2得到6,然后再加7。

下表中具有最高优先级的运算符在的表的最上面,最低优先级的在表的底部:

类别

操作符

关联性

后缀

() [] .

左到右

乘性

* /

左到右

加性

+ -

左到右

相等

==  !=

左到右

逻辑与

&&

左到右

逻辑或

||

左到右

赋值

= + = - = * = / =| =

从右到左

猜你喜欢

转载自blog.csdn.net/ming_147/article/details/79709471