Go语言运算符的用法和优先级(附带实例)
各个编程语言中的运算符作用基本相同,即在程序运行时执行数学或逻辑运算。
Go语言中包含算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符和其他运算符等 6 种运算符,下面分别讲解这 6 种运算符。
位运算符“&”、“|”和“^”能够对整数在内存中的二进制位进行操作,操作的结果如下表所示
“&”运算符的使用方法是先将两个操作数转换成二进制数,再将两个二进制操作数的最低位对齐(右对齐),然后让两个二进制数的每一位都做按位与运算。若同一位的两个值都为 1,则对应位的结果为 1,否则对应位的结果为 0。
例如,12 和 8 经按位与运算后的结果是 8。运算过程如下:
“|”运算符的使用方法是先将两个操作数转换成二进制数,再将两个二进制操作数的最低位对齐(右对齐),然后让两个二进制数的每一位都做按位或运算。若同一位的两个值都为 0,则对应位的结果为 0,否则对应位的结果为 1。
例如,4 和 8 经按位或运算后的结果是 12。运算过程如下:
“^”运算符的使用方法是先将两个操作数转换成二进制数,再将两个二进制操作数的最低位对齐(右对齐),然后让两个二进制数的每一位都做按位异或运算。若同一位的两个值相同,则对应位的结果为 0;若同一位的两个值不同,则对应位的结果为 1。
例如,31 和 22 经按位异或运算后的结果是 9。运算过程如下:
位运算符“<<”和“>>”能够对变量进行左移或右移运算,代码如下:
Go 语言中的复合赋值运算符及其说明如下表所示:
【实例】使用“短变量声明”的语法格式分别声明并初始化 int 类型的变量 a 和 b;其中,变量 a 的初始值为 7,变量 b 的初始值为 11。分别使用上表中的复合赋值运算符对这两个整数进行运算,代码如下:
如果两个运算符具有相同的优先级,那么左边的表达式比右边的表达式先被处理。
下表显示 Go 语言中各个运算符的优先级:
Go语言中包含算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符和其他运算符等 6 种运算符,下面分别讲解这 6 种运算符。
Go语言算术运算符
下表列出了 Go 语言中所有算术运算符及其说明,并且通过示例及其运算结果展示各个算术运算符的使用方法。其中,变量 a、b 和 c 的类型是 int,变量 a 的初始值为 7,变量 b 的初始值为 11。运算符 | 说明 | 示例 | 运算结果 |
---|---|---|---|
+ | 相加 | c = a + b | 18 |
- | 相减 | c = a - b | -4 |
* | 相乘 | c = a * b | 77 |
/ | 相除 | c = a / b | 0 |
% | 求余 | c = a % b | 7 |
++ | 自增 | a++ | 8 |
-- | 自减 | a-- | 6 |
Go语言关系运算符
下表列出了 Go 语言中的关系运算符及其说明,并且通过示例及其运算结果展示各个关系运算符的使用方法。其中,变量 a 和 b 的类型是 int,变量 a 的初始值为 7,变量 b 的初始值为 11。运算符 | 说明 | 示例 | 运算结果 |
---|---|---|---|
== | 检查左边值是否等于右边值 | fmt.Println(a == b) | false |
!= | 检查左边值是否不等于右边值 | fmt.Println(a != b) | true |
> | 检查左边值是否大于右边值 | fmt.Println(a > b) | false |
< | 检查左边值是否小于右边值 | fmt.Println(a < b) | true |
>= | 检查左边值是否大于或等于右边值 | fmt.Println(a >= b) | false |
<= | 检查左边值是否小于或等于右边值 | fmt.Println(a <= b) | true |
Go语言逻辑运算符
下表列出了 Go 语言中的逻辑运算符及其说明,并且通过示例及其运算结果展示各个逻辑运算符的使用方法。其中,有两个操作数(布尔类型的变量或返回布尔类型的值的表达式)a 和 b。运算符 | 说明 | 示例 | 运算结果 |
---|---|---|---|
&& | 逻辑与运算符:如果操作数 a 和 b 的值都是 true,那么 a && b 的值为 true,否则 a && b 的值为 false |
var a = true var b = false fmt.Println(a && b) |
false |
|| | 逻辑或运算符:如果操作数 a 和 b 的值有一个是 true,那么 a || b 的值为 true,否则 a || b 的值为 false |
var a = false var b = true fmt.Println(a || b) |
true |
! | 逻辑非运算符:如果操作数 a 的值为 true,那么 !a 的值为 false,否则为 true |
var a = false fmt.Println(!a) |
true |
Go语言位运算符
下表列出了 Go 语言中的位运算符及其说明,这些位运算符都是双目运算符。运算符 | 说明 |
---|---|
& | 按位与运算符 |
| | 按位或运算符 |
^ | 按位异或运算符 |
<< | 左移运算符。左移n位就是乘以2的n次方 |
>> | 右移运算符。右移n位就是除以2的n次方 |
位运算符“&”、“|”和“^”能够对整数在内存中的二进制位进行操作,操作的结果如下表所示
A | B | A & B | A | B | A ^ B |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
1 | 0 | 0 | 1 | 1 |
0 | 1 | 0 | 1 | 1 |
1 | 1 | 1 | 1 | 0 |
“&”运算符的使用方法是先将两个操作数转换成二进制数,再将两个二进制操作数的最低位对齐(右对齐),然后让两个二进制数的每一位都做按位与运算。若同一位的两个值都为 1,则对应位的结果为 1,否则对应位的结果为 0。
例如,12 和 8 经按位与运算后的结果是 8。运算过程如下:
0000 0000 0000 1100 (十进制 12 的二进制数) & 0000 0000 0000 1000 (十进制 8 的二进制数) ------------------- 0000 0000 0000 1000 (十进制 8 的二进制数)
“|”运算符的使用方法是先将两个操作数转换成二进制数,再将两个二进制操作数的最低位对齐(右对齐),然后让两个二进制数的每一位都做按位或运算。若同一位的两个值都为 0,则对应位的结果为 0,否则对应位的结果为 1。
例如,4 和 8 经按位或运算后的结果是 12。运算过程如下:
0000 0000 0000 0100 (十进制 4 的二进制数) | 0000 0000 0000 1000 (十进制 8 的二进制数) ------------------- 0000 0000 0000 1100 (十进制 12 的二进制数)
“^”运算符的使用方法是先将两个操作数转换成二进制数,再将两个二进制操作数的最低位对齐(右对齐),然后让两个二进制数的每一位都做按位异或运算。若同一位的两个值相同,则对应位的结果为 0;若同一位的两个值不同,则对应位的结果为 1。
例如,31 和 22 经按位异或运算后的结果是 9。运算过程如下:
0000 0000 0001 1111 (十进制 31 的二进制数) ^ 0000 0000 0001 0010 (十进制 22 的二进制数) ------------------- 0000 0000 0001 1011 (十进制 9 的二进制数)
位运算符“<<”和“>>”能够对变量进行左移或右移运算,代码如下:
a := 24 b := -16 fmt.Println("右移两位的结果是:", (a >> 2)) fmt.Println("左移三位的结果是:", (b << 3))运行结果如下:
24右移2位后的结果是:6
-16左移3位后的结果是:-128
Go语言复合赋值运算符
所谓复合赋值运算符,就是把赋值运算符与其他运算符合并成一个运算符,进而同时实现两种运算符的效果。Go 语言中的复合赋值运算符及其说明如下表所示:
运算符 | 说明 | 示例 | 等价效果 |
---|---|---|---|
+= | 相加结果赋予左侧 | a += b; | a = a + b; |
-= | 相减结果赋予左侧 | a -= b; | a = a - b; |
*= | 相乘结果赋予左侧 | a *= b; | a = a * b; |
/= | 相除结果赋予左侧 | a /= b; | a = a / b; |
%= | 取余结果赋予左侧 | a %= b; | a = a % b; |
&= | 与结果赋予左侧 | a &= b; | a = a & b; |
|= | 或结果赋予左侧 | a |= b; | a = a | b; |
^= | 异或结果赋予左侧 | a ^= b; | a = a ^ b; |
<<= | 左移结果赋予左侧 | a <<= b; | a = a << b; |
>= | 右移结果赋予左侧 | a >>= b; | a = a >> b; |
【实例】使用“短变量声明”的语法格式分别声明并初始化 int 类型的变量 a 和 b;其中,变量 a 的初始值为 7,变量 b 的初始值为 11。分别使用上表中的复合赋值运算符对这两个整数进行运算,代码如下:
package main import "fmt" func main(){ a := 7 //使用“短变量声明”的语法格式声明并初始化int类型变量a b := 11 //使用“短变量声明”的语法格式声明并初始化int类型变量b fmt.Println("a+=", a, "的结果是") b += a fmt.Println(b) b = 11 //修改变量b的值为11 fmt.Println("a-=", a, "的结果是") b -= a fmt.Println(b) b = 11 //修改变量b的值为11 fmt.Println("a*=", a, "的结果是") b *= a fmt.Println(b) b = 11 //修改变量b的值为11 fmt.Println("a/=", a, "的结果是") b /= a fmt.Println(b) b = 11 //修改变量b的值为11 fmt.Println("a%=", a, "的结果是") b %= a fmt.Println(b) b = 11 //修改变量b的值为11 fmt.Println("a&=", a, "的结果是") b &= a fmt.Println(b) b = 11 //修改变量b的值为11 fmt.Println("a|=", a, "的结果是") b |= a fmt.Println(b) b = 11 //修改变量b的值为11 fmt.Println("a^=", a, "的结果是") b ^= a fmt.Println(b) b = 11 //修改变量b的值为11 fmt.Println("a<<=", a, "的结果是") b <<= a fmt.Println(b) b = 11 //修改变量b的值为11 fmt.Println("a>>=", a, "的结果是") b >>= a fmt.Println(b) }运行结果如下:
a+=7的结果是 18
11+=7的结果是 18
11-=7的结果是 4
11*=7的结果是 77
11/=7的结果是 1
11%=7的结果是 4
11&=7的结果是 3
11|=7的结果是 15
11^=7的结果是 12
11<<=7的结果是 1408
11>>=7的结果是 0
Go语言运算符优先级
运算符的优先级决定表达式中运算执行的先后顺序。通常优先级由高到低的顺序依次是:自增和自减运算、算术运算、比较运算、逻辑运算及赋值运算。如果两个运算符具有相同的优先级,那么左边的表达式比右边的表达式先被处理。
下表显示 Go 语言中各个运算符的优先级:
优先级 | 描述 | 运算符 |
---|---|---|
1 | 括号 | () |
2 | 正负号 | +、- |
3 | 单目运算 | ++、--、! |
4 | 乘、除、求余 | *、/、% |
5 | 加、减 | +、- |
6 | 位移运算 | >>、<< |
7 | 关系运算 | <、>、>=、<= |
8 | 比较是否相等 | ==、!= |
9 | 按位与运算 | & |
10 | 按位异或运算 | ^ |
11 | 按位或运算 | | |
12 | 逻辑与运算 | && |
13 | 逻辑或运算 | || |
14 | 赋值运算符 | =、+=、-=、*=、/=、%=、>>=、<<=、&=、^=、|= |