GO语言入门-运算符
目录
概述:
go语言内置的运算符号可以分为算数运算符、关系运算符、逻辑运算符、位运算符、赋值运算符。全部的运算符如下:
+ | & | += | &= | && | == | != | ( | ) |
- | | | -= | |= | || | < | <= | [ | ] |
* | ^ | *= | ^= | <- | > | >= | { | } |
/ | << | /= | <<= | ++ | = | := | , | ; |
% | >> | %= | >= | -- | ! | ... | . | : |
&^ | &^= |
实际上 ++ -- 不算再运算符中。
没有乘幂和绝对值运算符号,对应标准库math中的Pow Abs函数。
分类:
算数运算符
运算符 | 描述 |
---|---|
+ | 加 |
- | 减 |
* | 乘 |
/ | 除 |
% | 取余 |
关系运算符号
运算符 | 描述 |
---|---|
== | 判断运算符左值和右值是否相等,相等返回true否则false |
!= | 判断运算符左值和右值是否不相等,不相等返回true否则false |
> | 判断运算符左值是否大于右值,大于返回true否则false |
< | 判断运算符左值是否小于右值,小于返回true否则false |
>= | 判断运算符左值是否大于等于右值,大于返回true否则false |
<= | 判断运算符左值是否小于等于右值,小于返回true否则false |
逻辑运算符
运算符 | 描述 |
---|---|
&& | 逻辑与,左值与右值均为true则返回ture,否则false |
|| | 逻辑或,左值与右值只要存在一个true则返回true,否则false |
! | 逻辑非,单目运算,操作数为true时则为false,否则false |
位运算符
运算符 | 描述 |
---|---|
& | 按位与,两位均为1则为1否则0 |
| | 按位或,两位至少有1则为1否则0 |
^ | 当为单目运算符时,按位取反。1取反后为0,0异或后取反为1 |
^ | 当为双目运算符时,按位异或,两个bit位不同时为1,也就是只能存在一个1或者只能存在一个0. |
&^ | 按位清零,都为1是为0. |
<< | 位左移,左移n位就是乘2的n次方 |
>> | 位右移,右移n为就是除2的n次方 |
其中&^主要用于清除位图bit为1的场景。达到一次把多个bit位(该bit位为1)的bit位置置为0.
赋值运算符
运算符 | 描述 |
---|---|
= | 赋值运算符号,右值赋值给左值 |
+= | 左右值相加后赋值给左值 |
-= | 左右值相减后赋值给左值 |
*= | 左右值相乘后赋值给左值 |
/= | 左右值相除后赋值给左值 |
%= | 左右值取余后把余数赋值赋值给左值 |
<<= | 左右值按位左移后赋值给左值 |
>>= | 左右值按位右移后赋值给左值 |
&= | 左右值按位与后赋值给左值 |
|= | 左右值按位或后赋值给左值 |
^= | 左右值按位异或后赋值给左值 |
&^= | 左值被右值按位清零后赋值给左值 |
按位清零测试代码如下:
var a = 0b1111
var c = 0b0110
fmt.Printf("左值 %b\n", a)
fmt.Printf("右值 %b\n", c)
a &^= c
fmt.Printf("按位清除后 %b\n", a)
/**output
左值 1111
右值 110
按位清除后 1001
*/
从上面可以看出1111高位是1但是0110高位是0,则高位还是1,1111中间两位为1,0110中间两位为1,因此1111的中间两位1被清零为00,最后结果值为:1001.
优先级
一元运算符有哦先机最高,二元则分为5个等级。从高道低分别为:
优先级 | 运算符 | 说明 |
---|---|---|
highest | * / % << >>& &^ | |
+ - | ^ | ||
== != < <= > >= | ||
&& | ||
lowest | || |
自增自减
自增、自减(++ --)在go语言中不是运算符号, 因此不能用于表达式,只能单独存在。并且不能前置,只能放到变量后面。
f := 1
//syntax error: unexpected ++, expecting } 不能前置++或者--
//++f
f++
//2 ++只能单独成行
fmt.Println(f)
//syntax error: unexpected ++, expecting }
//++ --是表达式所以报错
//if (f++) > 0 {
//}
addr := &f
//单目运算符*优先级高,因此(*addr)++是对addr指向的内存值进行自增
*addr++
//还是不能当表达式
//fmt.Println(*addr++)
fmt.Println(*addr) //3
/**
output:
2
3
*/
注意:++ --不能前置 也不能当做表达式。