GO学习之 运算符

.运算符介绍

运算符是一种特殊的符号,用以表示的数据的运算、复制和比较等。

go没有三元运算符。

1)算术运算符

2)赋值运算符

3)比较运算符/关系运算符

4)逻辑运算符

5)位运算符

6)其他运算符

1.算术运算符

算术运算符主要是对数值类型的变量进行运算的,比如:加减乘除。在Go程序中使用的非常多。

算术运算符一览

 

运算符

运算

范例

结果

+

正号

+3

3

-

负号

-4

-4

+

5+5

10

-

6-4

2

*

3*4

12

/

5/5

1

%

取模

7%5

2

++

自增

a=2 a++

a=3

--

自减

a=2 a--

a=1

+

字符串相加

“he”+”llo”

“hello”

代码例子如下:

package main

import "fmt"

func main() {
    // 运算符举例
    var a int = 21
    fmt.Println(+1)
    fmt.Println(-1)
    fmt.Println(5 + 5)
    fmt.Println(5 - 3)
    fmt.Println(3 * 4)
    fmt.Println(6 / 3)
    // 除法使用的特点:
    // 说明: 如果运算的数都是整数,那么除后,去掉小数部,保留整数部分
    fmt.Println(10 / 4)

    var n1 float32 = 10 / 4
    fmt.Println(n1)

    // 如果我们希望保留小数部分,则需要有浮点数参与运算
    var n2 float32 = 10.0 / 4
    fmt.Println(n2)

    // 取模使用的特点:
    // 取模公式如下:a % b = a - a / b * b
    fmt.Println("10模3等于  :", 10%3)     //  1
    fmt.Println("-10模3等于 :", -10%3)   //  = -10 - (-10) / 3 * 3 = -10 - (-9) = -1
    fmt.Println("10模-3等于 :", 10%-3)   //  = 10 - 10/(-3)*(-3) =   10 - 9 = 1
    fmt.Println("-10模-3等于:", -10%-3) //  = -10 - (-10)/(-3)*(-3) = -10 + 9 = -1

    a--
    fmt.Printf(" a 的值为 %d\n", a)
    a = 21 // 为了方便测试,a 这里重新赋值为 21
    a++
    fmt.Printf(" a 的值为 %d\n", a)
}

1算术运算符的细节说明

1.对于除号”/”,它的整数除和小数除是有区别的:整数之前做除法时,只保留整数部分而舍弃小数部分。例如: x := 19/5 ,结果是 3  去掉小数部分

2.当对一个数取模时,可以等价a%b=a-a/b*b

3.Golang的自增自减只能当做一个独立语言时,不能这样使用[和其他语言有区别,注意]

 b := a ++  或者 b = a-- 并且没有 ++a -- a

4.Golang的设计者去掉c/java中的自增自减容易混淆的写法。

练习题1// 假如还有97天,问:**个星期零**天

package main

import (
    "fmt"
)

func main() {
    // 假如还有97天,问:**个星期零**天
    var days int = 97
    var week int = days / 7
    var day int = days % 7
    fmt.Printf("%d个星期零%d天\n", week, day)
}

练习题2

package main

import (
    "fmt"
)

func main() {
    // 定义一个变量保存华氏温度,华氏温度转换摄氏度的公式为:
    // 5/9*(华氏温度-100),请求出华氏温度对应的摄氏温度
    // 注意当一个整数除以另外一个比它的整数的时候,go中等于0,除非使用小数才会得出小数
    var huashi float32 = 134.2
    var sheshi float32 = 5.0 / 9 * (huashi - 100)
    fmt.Println("摄氏温度为:", sheshi)

}

2.关系运算符(比较运算符)

1)关系运算符的结果都是bool类型,也就是要么是true,要么是false

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

 

运算符

运算

范例

结果

==

相等于

4==3

false

!=

不等于

4!=3

true

<

小于

4<3

false

>

大于

4>3

true

<=

小于等于

4<=3

false

>=

大于等于

4>=3

true

 

举例代码例子:

package main

import (
    "fmt"
)

func main() {
    // 演示关系运算符的使用
    var n1 int = 9
    var n2 int = 8
    fmt.Println(n1 == n2) // flase
    fmt.Println(n1 != n2) // true
    fmt.Println(n1 > n2)  // true
    fmt.Println(n1 >= n2) // true
    fmt.Println(n1 < n2)  // flase
    fmt.Println(n1 <= n2) // flase

    flag := n1 > n2
    fmt.Println("flag=", flag)
}

1关系运算符的细节说明

1.关系运算符组成的表达式,我们称为关系表达式:a>b

2.比较运算符”==” 不能误写为”=”

3.逻辑运算符

假定A值为True,B值为False

运算符

描述

结果

&&

逻辑与运算符。如果两边的操作数都是True,则为True,否则为False

(A&&B) False

||

逻辑或运算符。如果两边的操作数有一个True,则为True,否则为False

(A||B) True

!

逻辑非运算符。如果条件为True,则逻辑为false,否则为True

!(A&&B) True

逻辑运算举例:

package main

import (
    "fmt"
)

func main() {
    // 逻辑运算符的使用  &&
    var age int = 40
    if age > 30 && age < 50 {
        fmt.Println("ok1") // 执行
    }

    if age > 30 && age < 40 {
        fmt.Println("ok2") // 不执行
    }

    if age > 30 || age < 50 {
        fmt.Println("ok3") // 执行
    }

    if age > 30 || age < 40 {
        fmt.Println("ok4") // 执行
    }

    if !(age > 30 && age < 50) {
        fmt.Println("ok5") // 不执行
    }
    if !(age > 30 && age < 40) {
        fmt.Println("ok6") // 执行
    }
}

1逻辑运算符的细节说明

1.&&也叫短路与:如果第一个条件为False,则第二个条件不会判断,最终结果为False

2.||也叫短路或 :如果第一个条件为True,则第二个条件不会判断,最终结果为True

举例:

package main

import (
    "fmt"
)

func test() bool {
    fmt.Println("test ok....")
    return true
}

func main() {
    var i int = 10
    fmt.Println("test01=========")
    if i > 9 && test() {
        fmt.Println("0k...")
    } // 这个先打印 test ok .... 再打印 ok...
    fmt.Println("test02==========")
    if i < 9 && test() {
        fmt.Println("0k...")
    } // 不打印   短路与现象

    fmt.Println("test03========")
    if i > 9 || test() {
        fmt.Println("0k...")
    } // 只打印ok   短路或现象
    fmt.Println("test04========")
    if i < 9 && test() {
        fmt.Println("0k...")
    } // 这个先打印 test ok .... 再打印 ok...

}

4.赋值运算符

赋值运算符就是将某个运算后的值,赋给指定的变量。

运算符

描述

结果

=

简单的赋值运算符,将右表达式赋给左值

C = A+BA+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

赋值运算举例:

package main

import "fmt"

func main() {
    // 赋值运算符的使用演示
    var i int
    i = 10 // 基本赋值
    fmt.Println(i)
    // 有两个变量,a和b ,要求将其进行交换,最终打印结果
    // a = 9, b = 2 ===>  a = 2 b = 9
    a := 9
    b := 2
    fmt.Printf("交换前的情况是a=%v,b=%v\n", a, b)
    // 定义一个临时变量
    t := a
    a = b
    b = t
    fmt.Printf("交换后的情况是a=%v,b=%v\n", a, b)

    // 复合赋值操作
    a += 17
    fmt.Println(a)
}

1赋值运算符的细节说明

1.运算顺序从右到左

2.赋值运算符的左边,只能是变量,右边可以是变量、表达式、常量

3.复合赋值运算符等价于下面的效果

[如:a+=3 等价于 a = a + 3]

举例1

package main

import "fmt"

func test() int {
    return 1
}

func main() {

    // 
    var c int = 5
    var d int 
    d = c + 3  // 赋值运算的执行顺序是从右向左
    fmt.Println(d)  // 8
    // 赋值运算符的左边,只能是变量,右边可以是变量、表达式、常量
    var e int
    e = c
    fmt.Println(e)   // 5
    e = 8 + c * 2
    fmt.Println(e)  // 18
    e = test() + 90
    fmt.Println(e)  // 91
    e = 900
    fmt.Println(e)  // 900

}

举例2:

package main

import "fmt"

func test() int {
    return 1
}

func main() {
    // 有两个变量,a和b ,要求将其进行交换,但不允许使用中间变量,最终打印结果

    var a int = 6
    var b int = 5
    fmt.Printf("开始值:a=%v,b=%v\n",a,b)
    
    a = a + b 
    b = a - b
    a = a - b
    fmt.Printf("交换后:a=%v,b=%v\n",a,b)

5.位运算符与移运算符

运算符

描述

&

按位与运算符”&”是双目运算符。其功能是参与运算的两数各对应的二进位相与。      运算规则是: 同时为1结果为1 ,否则为0     

|

按位或运算符”|”是双目运算符。其功能是参与运算的两束各对应的二进位相或        运算规则是:有一个为1,结果为1,否则为0

^

按异或运算符”^” 是双目运算符。其功能是参与运算的两数各对应的二进制位相异或。  运算规则是:当二进位不同时,结果为1,否则为0

<<

左移运算符”<<” 是双目运算符。其功能把”<<” 左边的运算数的各二进位全部左移若干位,高位丢弃,低位补0。左移补0.左移n位就是乘以2n次方。

>>

右移运算符”<<” 是双目运算符。其功能把”<<” 右边的运算数的各二进位全部右移若干位,高位丢弃,低位补0。右移补0。右移n位就是乘以2n次方。

举例1

package main

import "fmt"

func main() {
    // 移运算例子
    var a int = 1 >> 2
    var b int = -1 >> 2
    var c int = 1 << 2
    var d int = -1 << 2
    // a,b,c,d结果是什么
    fmt.Println("a=",a)
    fmt.Println("b=",b)
    fmt.Println("c=",c)
    fmt.Println("d=",d)

}

 举例2:

ackage main

import "fmt"

func main() {
// 位运算例子
// 二进制的补码的运算
    fmt.Println(2&3)
    fmt.Println(2|3)
    fmt.Println(13&7)
    fmt.Println(5|4)
    fmt.Println(-3^3)

6.其他运算符

 

运算符

描述

实例

&

返回变量存储地址     

&a ;将给出变量的实际地址

*

指针变量

*a ; 是一个指针变量

 举例:

package main

import "fmt"

func main() {
    // 演示 & 和 * 的使用
    a := 200
    fmt.Println("a的地址=",&a)

    var ptr *int = &a
    fmt.Println("ptr指向的值是=",*ptr)
}

特别说明:

GO语言明确不支持三目运算。只能用if  else代替。

GO的设计理念:

一种事情有且只有一种方法完成。

二.运算符的优先级

1)运算符有不同的优先级,所谓优先级就是表达式运算中的运算顺序。如下表,上一行运算符总优先于下一行。

2)只有单目运算符、赋值运算符是从右向左运算的

3)大致的顺序整理

1.括号,++ --

2.单目运算

3.算术运算符

4.移位运算

5.关系运算符

6.位运算符

7.逻辑运算符

8.赋值运算符

9.符号

分类

描述

关联性

后缀

()[]->++--

左到右

单目

+ - ~ (type) * & sizeof

右到左

乘法

*  /   %

左到右

加法

+  -

左到右

移位

<<   >>

左到右

关系

<  <=  >  >=

左到右

相等(关系)

==  =

左到右

按为AND

&

左到右

按为XOR

^

左到右

按为OR

|

左到右

逻辑AND

&&

左到右

逻辑OR

||

左到右

赋值运算符

= += -= *= /= %= >>= <<= &= ^= |=

右到左

符号

,

左到右

 

上表优先级从上到下,从高到低。

 

posted @ 2020-01-28 23:14  pycoder_hsz  阅读(211)  评论(0编辑  收藏  举报