目录
一、运算符
1、算数运算符
func main() {
// +号
// 1、表正数 2、相加 3、字符串拼接
var n1 int = +1
fmt.Println(n1)
var n2 int = 2 + 1
fmt.Println(n2)
var n3 string = "aer" + "opi"
fmt.Println(n3)
// -号 相减
var n4 = 10 - 5
fmt.Println(n4)
// /号
// int类型相除,结果为int型
var n5 = 10 / 2
fmt.Printf("n5对应的类型是: %T, n5 = %v \n", n5, n5)
// 浮点类型参与运算,结果为浮点型
var n6 = 10.2 / 3
fmt.Printf("n6对应的类型是: %T, n6 = %v \n", n6, n6)
// %取模,等价公式:a%b = a-a/b*b
fmt.Println(10%3)
fmt.Println(-10%3)
// ++自增 --自减
// 需要注意的是,Go中自增自减只能在变量后面,++n --n这种写法都是错误的
// 自增自减只能单独使用,不能参与到运算中
var n7 = 10
fmt.Printf("n7自增前的值是:%v \n", n7)
n7++
fmt.Printf("n7自增后的值是:%v \n", n7)
}
运行结果:
2、赋值运算符
func main() {
var a int = 21
var c int
// 将=右边的值赋给左边值
c = a
fmt.Printf("= 运算符实例,c 值为 = %d\n", c )
// 相加后再赋值 c = c + a
c += a
fmt.Printf("+= 运算符实例,c 值为 = %d\n", c )
// 相减后再赋值 c = c - a
c -= a
fmt.Printf("-= 运算符实例,c 值为 = %d\n", c )
// 相乘后再赋值 c = c * a
c *= a
fmt.Printf("*= 运算符实例,c 值为 = %d\n", c )
// 相除后再赋值 c = c / a
c /= a
fmt.Printf("/= 运算符实例,c 值为 = %d\n", c )
c = 200;
// 左移后赋值 c = c << 2
c <<= 2
fmt.Printf("<<= 运算符实例,c 值为 = %d\n", c )
// 右移后赋值 c = c >> 2
c >>= 2
fmt.Printf(">>= 运算符实例,c 值为 = %d\n", c )
// 按位与后赋值 c = c & 2
c &= 2
fmt.Printf("&= 运算符实例,c 值为 = %d\n", c )
// 按位异或后赋值 c = c ^ 2
c ^= 2
fmt.Printf("^= 运算符实例,c 值为 = %d\n", c )
// 按位或后赋值 c = c | 2
c |= 2
fmt.Printf("|= 运算符实例,c 值为 = %d\n", c )
}
运行结果:
3、关系运算符
关系运算符的结果都是bool型
关系运算符经常用在流程控制中
func main() {
var a int = 21
var b int = 20
fmt.Printf("a值为:%v b值为:%v\n", a, b )
// 检查两个值是否相等,如果相等返回 True 否则返回 False
fmt.Printf("== 运算符实例,a == b值为 = %v\n", a==b )
// 检查两个值是否不相等,如果不相等返回 True 否则返回 False。
fmt.Printf("!= 运算符实例,a != b值为 = %v\n", a != b )
// 检查左边值是否大于右边值,如果是返回 True 否则返回 False。
fmt.Printf("> 运算符实例,a > b值为 = %v\n", a > b )
// 检查左边值是否小于右边值,如果是返回 True 否则返回 False。
fmt.Printf("< 运算符实例,a < b值为 = %v\n", a < b )
// 检查左边值是否大于等于右边值,如果是返回 True 否则返回 False。
fmt.Printf(">= 运算符实例,a >= b值为 = %v\n", a >= b )
// 检查左边值是否小于等于右边值,如果是返回 True 否则返回 False。
fmt.Printf("<= 运算符实例,a <= b值为 = %v\n", a <= b )
}
运行结果:
4、逻辑运算符
逻辑运算 | ||||||
A | B | 与AND | 或OR | 非NOT(A) | 异或XOR | 与或NAND |
0 | 0 | 0 | 0 | 1 | 0 | 1 |
0 | 1 | 0 | 1 | 1 | 1 | 1 |
1 | 0 | 0 | 1 | 0 | 1 | 1 |
1 | 1 | 1 | 1 | 0 | 0 | 0 |
func main() {
// && 逻辑与运算
// 短路与,只要第一个值/表达式为false,则后面表达式不用运算,结果就是false
fmt.Printf("-----&& 逻辑与运算-----\n")
fmt.Printf(" true && true值为 = %v\n", true&&true )
fmt.Printf(" true && false值为 = %v\n", true&&false )
fmt.Printf(" false && true值为 = %v\n", false&&true )
fmt.Printf(" false && false值为 = %v\n", false&&false )
// || 逻辑或运算
// 短路或,只要第一个值/表达式为true,则后面表达式不用运算,结果就是true
fmt.Printf("-----|| 逻辑或运算-----\n")
fmt.Printf(" true || true值为 = %v\n", true||true )
fmt.Printf(" true || false值为 = %v\n", true&&false )
fmt.Printf(" false || true值为 = %v\n", false||true )
fmt.Printf(" false || false值为 = %v\n", false||false )
// ! 逻辑非运算
fmt.Printf("-----! 逻辑非运算-----\n")
fmt.Printf(" !true值为 = %v\n", !true )
fmt.Printf(" !false值为 = %v\n", !false )
}
运算结果:
5、位运算符
func main() {
// 60 = 0011 1100
var a uint = 60
// 13 = 0000 1101
var b uint = 13
var c uint = 0
// 双目运算符,按位与运算符"&"。 其功能是参与运算的两数各对应的二进位相与
// 12 = 0000 1100
c = a & b
fmt.Printf("a & b 时 c 的十进制值为:%d, 二进制值为:%b\n", c, c )
// 双目运算符,按位或运算符"|"。 其功能是参与运算的两数各对应的二进位相或
// 61 = 0011 1101
c = a | b
fmt.Printf("a | b 时 c 的十进制值为:%d, 二进制值为:%b\n", c, c )
// 双目运算符,按位异或运算符"^"。 其功能是参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1
// 49 = 0011 0001
c = a ^ b
fmt.Printf("a ^ b 时 c 的十进制值为:%d, 二进制值为:%b\n", c, c )
// 双目运算符,左移运算符"<<"。左移n位就是乘以2的n次方。 其功能把"<<"左边的运算数的各二进位全部左移若干位,由"<<"右边的数指定移动的位数,高位丢弃,低位补0。
// 240 = 1111 0000
c = a << 2
fmt.Printf("a << 2 时 c 的十进制值为:%d, 二进制值为:%b\n", c, c )
// 双目运算符,右移运算符">>"。右移n位就是除以2的n次方。 其功能是把">>"左边的运算数的各二进位全部右移若干位,">>"右边的数指定移动的位数。
// 15 = 0000 1111
c = a >> 2
fmt.Printf("a >> 2 时 c 的十进制值为:%d, 二进制值为:%b\n", c, c )
}
运行结果:
6、其他运算符
func main() {
// 定义变量
// & 返回变量存储地址
var a int = 60
fmt.Println("a的值为:", a)
fmt.Println("a对应的存储空间的地址为:", &a)
// * 取指针指向的值
var ptr *int = &a
fmt.Println("指针ptr的值为:", ptr)
fmt.Println("指针ptr指向的具体数值为:", *ptr)
}
运行结果:
7、运算符优先级
优先级 | 运算符 |
5 | * / % << >> & &^ |
4 | + - | ^ |
3 | == != < <= > >= |
2 | && |
1 | || |
二元运算符的运算方向均是从左至右,表中运算符优先级由上至下代表优先级由高到低
可以通过()提高优先级