目录
- 前言
- 算术运算符
- 关系运算符
- 逻辑运算符
- 位运算符
- 赋值运算符
- 取地址和指针运算符
- 运算符优先级
前言
go语言和其他语言的运算符一样,大体上分为这么几种,算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符、取地址和指针运算符。最后也会说一下它们的优先级。
算术运算符
| 运算符 | 描述 |
|---|---|
| + | 相加 |
| - | 相减 |
| * | 相乘 |
| / | 相除 |
| % | 取余 |
| ++ | 自增 |
| – | 自减 |
//demo1
package mainimport "fmt"func main() {a, b := 20, 10var c intc = a + bfmt.Printf("a + b = %d\n", c)c = a - bfmt.Printf("a - b = %d\n", c)c = a * bfmt.Printf("a * b = %d\n", c)c = a / bfmt.Printf("a / b = %d\n", c)c = a % bfmt.Printf("取余 = %d\n", c)a++fmt.Printf("自增 = %d\n", a)a--fmt.Printf("自减 = %d\n", a)
}
输出结果是:
a + b = 30
a - b = 10
a * b = 200
a / b = 2
取余 = 0
自增 = 21
自减 = 20
关系运算符
| 运算符 | 描述 |
|---|---|
| == | 相等返回true不相等返回false |
| != | 不相等返回true否则返回false |
| > | 左边值大于右边值返回true否则返回false |
| < | 左边值小于右边值返回true否则返回false |
| >= | 左边值大于等于右边值返回true否则返回false |
| < | 左边值小于等于右边值返回true否则返回false |
逻辑运算符
| 运算符 | 描述 |
|---|---|
| && | 逻辑与(AND),两边都为真为true否则false |
| || | 逻辑或(OR),两边都为假为true否则false |
| ! | 逻辑非(NOT),若A为真,则非A为假 |
//demo2
package mainimport "fmt"func main() {a := trueb := falsefmt.Println(a && b)fmt.Println(a || b)fmt.Println(!a)
}
输出结果是:
false
true
false
位运算符
位运算符是对内存中的二进制进行运算
| 运算符 | 描述 |
|---|---|
| & | 按位与,对两边的操作数按位与,相同为1不同为0 |
| | | 按位或,对两边的操作数按位或,都为0才为0,只要有一个1则为1 |
| ^ | 按位异或,对两边的操作数按位异或,相同为0不同为1 |
| << | 左移,左移n位就是乘以2的n次方 |
| >> | 右移,右移n位就是除以2的n次方 |
可以看一下上一篇讲常量文章末尾的思考题。
赋值运算符
= 将表达式的值赋给左值(将右边的值赋给左边)
+= 将左右相加赋给左边
-= *= /= %= <<= >>= &= ^= |=
取地址和指针运算符
go语言和C语言一样也有指针和地址的概念
| 运算符 | 描述 |
|---|---|
| & | 返回变量存储地址,&a |
| * | 指针变量,地址当中的内容,*a |
//demo3
package mainimport "fmt"func main() {var a int = 1var p *intp = &a //p中存的是a的地址fmt.Println(p) //输出的是a的地址fmt.Println(*p) //*p是通过a的地址找到a的内容
}
输出结果是:
0xc00000a0e8
1
当然你的地址和我的地址可能不一样,这个是随机的,就和你去酒店开房,给你分配的房间号是随机的,只要空着,都可能会分配给你。内存相当于酒店,地址相当于房间号。
运算符优先级
运算符分优先级也就是说有些运算符先算有些后算,当同一优先级的运算符一起出现,从左往右算。
第一优先级 * / % << >> & &^
第二优先级 + - | ^
第三优先级 == != > < >= <=
第四优先级 &&
第五优先级 ||
可以通过小括号提升某个表达式的整体优先级
package mainimport "fmt"func main() {a, b, c, d := 20, 10, 15, 5var e inte = (a + b) * c / dfmt.Println(e)e = a + (b*c)/dfmt.Println(e)e = (a + b) * (c / d)fmt.Println(e)e = ((a + b) * c) / dfmt.Println(e)
}
输出结果是:
90
50
90
90
