zoukankan      html  css  js  c++  java
  • 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
    ", a)
        a = 21 // 为了方便测试,a 这里重新赋值为 21
        a++
        fmt.Printf(" a 的值为 %d
    ", 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天
    ", 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
    ", a, b)
        // 定义一个临时变量
        t := a
        a = b
        b = t
        fmt.Printf("交换后的情况是a=%v,b=%v
    ", 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
    ",a,b)
        
        a = a + b 
        b = a - b
        a = a - b
        fmt.Printf("交换后:a=%v,b=%v
    ",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

    ||

    左到右

    赋值运算符

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

    右到左

    符号

    ,

    左到右

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

  • 相关阅读:
    玩家的numpertpry 对象 中 不仅仅要同步 君主武将的等级,阶级也要同步
    synchronized 的真正含义
    学习笔记——WPF
    学习笔记——AOP
    好记性不如烂笔头——WebService与Remoting
    好记性不如烂笔头——垃圾回收
    “返回顶部”实现一例
    ASP.NET MVC脚本及样式压缩
    设计模式学习笔记——迭代器模式
    设计模式学习笔记——策略模式
  • 原文地址:https://www.cnblogs.com/hszstudypy/p/12507837.html
Copyright © 2011-2022 走看看