3.3 运算符
优质
小牛编辑
138浏览
2023-12-01
运算符
在Go中运算符包括,逻辑运算符、 算术运算符、位运算符、接收运算符。根据运算符是不是要连接两个变量,我们把运算符分成一元运算符和二元运算符,一元运算符包括:
+ 正号 var x int =-1; +x ---> -1
- 负号 var x int =-1; -x ---> 1
! 逻辑非 !真 -----> 假
++ 连加 与C语言不一样,++ 和 -- 操作只可以当成一个语句来使用。
-- 连减 我在下面详细讲解这个
^ 按位异或
* 指针 *p表示 p所代表的数值的指针
& 地址操作符 &a 表示a的内存地址
<- 接收操作符 <-ch 从通道ch中取值
二元运算符包括:
+ 加法 a+b
- 减法 a-b
* 乘法 a*b
/ 除法 a/b a、b为整数的时候,b不可以为0,如果编译器可以检查到会显
示division by zero a、b为float类型的时候, b==0,会得到无穷大,显示为+Inf
% 取模 10%3=1,计算余数
|| 逻辑或
&& 逻辑与
== 判断等于
!= 判断不等于
< 判断小于
<= 判断小于等于
> 判断大于
>= 判断大于等于
<< 二进制左移位运算符 这个见下面的例子
>> 二进制右移位运算符
& 按位与
&^ 按位清除 10 &^ 3 ---> 8
注意一件事情,就是Go不支持三元运算符,虽然笔者认为C语言里面的三元运算符使用起来很帅也很方便,但是确实对有些代码容易产生逻辑错误。
1)逻辑运算符
逻辑运算符||,&&,!代表逻辑或、与、非,==、!=、<、<=、>、>=是判断运算符。除了!是一元运算符以外都是二元运算符。二元逻辑运算符的两侧是布尔值或者是产生布尔值的表达式。此处千万注意,Go语言不同于C语言,C语言的布尔值是0和非0,在Go语言里面使用bool来表示布尔类型,值只能是true或者false,也就是“真”和“假”。
2)算数运算符
算数运算符包括:+、-、、/、%、++、-- 用程序简单介绍一下+、-、、/、% 源程序
package main
import "fmt"
func main() {
var (
a, b int = 3, 2
c int = 8
x, y float64 = 3.2, 8.0
z float64 = 16.0
)
fmt.Printf("3 + 2 =%2d\r\n", a+b)
fmt.Printf("3 - 2 =%2d\r\n", a-b)
fmt.Printf("2 * 8 =%2d\r\n", b*c)
fmt.Printf("8 / 2 =%2d\r\n", c/b)
fmt.Printf("8 %% 2 =%2d\r\n", c%a)
fmt.Printf("3.2 + 8.0 =%4.2f\r\n", x+y)
fmt.Printf("3.2 - 8.0 =%4.2f\r\n", x-y)
fmt.Printf("3.2 * 8.0 =%4.2f\r\n", x*y)
fmt.Printf("16.0 / 8.0 =%4.2f\r\n", z/y)
//fmt.Println(z % x) //这个是错误的语句,取模只能是在整数里面
}
下面重点讲解一下++、--
在我的工作经验里面,一般 like C的语言,一般都支持++、--,而且都是支持i++,++i这种形式,也支持a=i++这种形式,唯有Go不同。首先,Go不支持++i、--i这种形式;其次,Go不支持这种形式的赋值。这么做是有好处的,所有学习C的人,几乎都遇到过,++i的值是多少的困惑,现在使用Go,你将完全不会遇到这个问题。
var i int =0
i++ //合法
++i //非法
i-- //合法
--i //非法
a:=i++ //非法
fmt.Println(i++) //非法
运算符的优先级
优先级 运算符
5 * / % << >> & &^
4 + - | ^
3 == != < <= > >=
2 &&
1 ||
3)位运算符
& 、 | 、 ^ 、&^ 源程序
package main
import "fmt"
func main() {
var (
a, b int = 101, 142
)
c := a & b //按位与
fmt.Printf("a & b = %4d & %4d ===> %08b & %08b ====>%4d 换成二进制是:%08b\r\n", a, b, a, b, c, c)
d := a | b //按位或
fmt.Printf("a | b = %4d & %4d ===> %08b | %08b ====>%4d 换成二进制是:%08b\r\n", a, b, a, b, d, d)
e := a ^ b //按位异或
fmt.Printf("a ^ b = %4d & %4d ===> %08b | %08b ====>%4d 换成二进制是:%08b\r\n", a, b, a, b, e, e)
f := a &^ b //按位清除,这个比较特殊,就是以后面的数字为准对前面的数字的二进制进行相应的清零操作。
//如果后面的数字的某个二进制位是1,那么前面数字相应的二进制位就变成0,反之保持原数不变。
fmt.Printf("a &^ b = %4d & %4d ===> %08b | %08b ====>%4d 换成二进制是:%08b\r\n", a, b, a, b, f, f)
}
位移运算符
左位移<<、右位移>>源程序
package main
import "fmt"
func main() {
fmt.Printf(" 8 << 2 = %2d\r\n", 8<<2)
fmt.Printf(" 2 << 5 = %2d\r\n", 2<<5)
fmt.Printf("64 >> 3 = %2d\r\n", 64>>3)
fmt.Printf("64 >> 6 = %2d\r\n", 64>>6)
fmt.Printf("64 >> 7 = %2d\r\n", 64>>7) //64换算成二进制是01000000,右位移7位就变成0
}
左位移N位,右侧空白部分使用 0 填充,相当于每位移一位在源数的基础上乘以2,左位移N位,相当于乘以2的N次幂。同理,右位移N位,左侧空白部分使用 0 填充,相当于每位移一位在源数的基础上除以2,右位移N位,相当于除以2的N次幂。不过,位移次数超过原数的二进制长度,结果就是0。