一、算术运算符
运算符 | 描述 |
---|---|
+ | 相加 |
- | 相减 |
* | 相乘 |
/ | 相除 |
% | 求余 |
代码示例:
package main
import "fmt"
func main() {
// 算术运算符
a := 5
b := 2
fmt.Printf("a+b=%v\n", a+b) // a+b=7
fmt.Printf("a-b=%v\n", a-b) // a-b=3
fmt.Printf("a*b=%v\n", a*b) // a*b=10
fmt.Printf("a/b=%v\n", a/b) // a/b=2
fmt.Printf("a%%b=%v\n", a%b) // a%b=1 想要打印%号,可以用%转义,即 %%
}
注意: ++
(自增)和 --
(自减)在Go语言中是单独的语句,并不是运算符。
package main
import "fmt"
func main() {
a := 5
b := 2
if a > 4 {
a++
} else {
a--
}
fmt.Print(a)
}
二、关系运算符
运算符 | 描述 |
---|---|
== | 检查两个值是否相等,如果相等返回 True 否则返回 False。 |
!= | 检查两个值是否不相等,如果不相等返回 True 否则返回 False。 |
> | 检查左边值是否大于右边值,如果是返回 True 否则返回 False。 |
>= | 检查左边值是否大于等于右边值,如果是返回 True 否则返回 False。 |
< | 检查左边值是否小于右边值,如果是返回 True 否则返回 False。 |
<= | 检查左边值是否小于等于右边值,如果是返回 True 否则返回 False。 |
package main
import "fmt"
func main() {
a := 5
b := 2
fmt.Println(a == b) // false
fmt.Println(a != b) // true
fmt.Println(a > b) // true
fmt.Println(a >= b) // true
fmt.Println(a < b) // false
fmt.Println(a <= b) // false
}
三、逻辑运算符
运算符 | 描述 |
---|---|
&& | 逻辑 AND 运算符。 如果两边的操作数都是 True,则为 True,否则为 False。 |
|| | 逻辑 OR 运算符。 如果两边的操作数有一个 True,则为 True,否则为 False。 |
! | 逻辑 NOT 运算符。 如果条件为 True,则为 False,否则为 True。 |
package main
import "fmt"
func main() {
a := 5
b := 2
c := 3
fmt.Println(a > b && c > b) // true
fmt.Println(a < b && c > b) // false
fmt.Println(a > b || c > b) // true
fmt.Println(a < b || c < b) // false
fmt.Println(!(a > b)) // false
}
四、位运算符
位运算符对整数在内存中的二进制位进行操作
运算符 | 描述 |
---|---|
& | 参与运算的两数各对应的二进位相与。 (两位均为1才为1) |
| | 参与运算的两数各对应的二进位相或。 (两位有一个为1就为1) |
^ | 参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。 (两位不一样则为1) |
<< | 左移n位就是乘以2的n次方。 “a<<b”是把a的各二进位全部左移b位,高位丢弃,低位补0。 |
>> | 右移n位就是除以2的n次方。 “a>>b”是把a的各二进位全部右移b位。 |
package main
import "fmt"
func main() {
a := 5 // 0101
b := 6 // 0110
fmt.Println(a & b) // 4
fmt.Println(a | b) // 7
fmt.Println(a ^ b) // 3
fmt.Println(a >> 1) // 2
fmt.Println(a << 1) // 10
}
分析:
a --转换成二进制--> 0101
b -- 转换成二进制--> 0110
0101
a & b ---> 0110
--------
0100 ---> 转换成十进制为 4
0101
a | b ---> 0110
--------
0111 ---> 转换成十进制为 7
0101
a ^ b ---> 0110
--------
0011 ---> 转换成十进制为 3
a >> 1 ---> 0101 ---> 所有位向右(后)移动一位,在最前面补0 ---> 0010 ---> 转换成十进制 2
a << 1 ---> 0101 ---> 所有位向左(前)移动一位,在最后面补0 ---> 1010 ---> 转换成十进制 10
注意,对于位的移动操作,如果超过原本数据类型的长度,只会从后往前保留对应的位数,如:
package main
import "fmt"
func main() {
a := int8(1) // 定义一个八位的整数
fmt.Println(a << 10) // 0
}
分析:
a<<1 ---> 00000001 ---> 所有位向左移动十位在最后面补0 ---> 10000000000 ---> 但是a最长只能是八位,多以只能从右往左保留八位,00000000,转换成十进制结果为0
示例:有一堆数字,如果除了一个数字以外,其他数字都出现了两次,那么如何找到出现一次的数字?
思路:可以使用异或运算操作,0 与任何数值异或的结果都为值本身,相同的值异或结果为 0
package main
import "fmt"
func main() {
nums := [...]int{1, 1, 2, 3, 2}
obj := 0
for _, v := range nums {
obj ^= v
}
fmt.Println(obj)
}
五、赋值运算符
运算符 | 描述 |
---|---|
= | 简单的赋值运算符,将一个表达式的值赋给一个左值 |
+= | 相加后再赋值 |
-= | 相减后再赋值 |
*= | 相乘后再赋值 |
/= | 相除后再赋值 |
%= | 求余后再赋值 |
<<= | 左移后赋值 |
>>= | 右移后赋值 |
&= | 按位与后赋值 |
|= | 按位或后赋值 |
^= | 按位异或后赋值 |
package main
import "fmt"
func main() {
a := 5
var b int
b = a
fmt.Println(b)
a += 2 // a = a + 2
a -= 2 // a = a - 2
a *= 2 // a = a * 2
a /= 2 // a = a / 2
a %= 2 // a = a % 2
}