Go语言运算符
目录
运算符用于在程序运行时执行数学或逻辑运算。
go 语言内置的运算符有:算术运算符
、赋值运算符
、逻辑运算符
、关系运算符
、位运算符
、其他运算符
算术运算符
算数运算符是对数值型的变量进行运算的,比如:加减乘除,在go程序中使用的非常多。
下表列出了所有go语言的算术运算符。假定 a 值为 10,b 值为 3。
运算符 | 描述 | 实例 |
---|---|---|
+ | 相加 | a + b 输出结果13 |
- | 相减 | a - b 输出结果 7 |
* | 相乘 | a * b 输出结果 30 |
/ | 相除 | a / b 输出结果 3 |
% | 求余 | a % b 输出结果 1 |
++ | 自增 | a++ 输出结果 11 |
-- | 自减 | a-- 输出结果 2 |
注意事项
-
对于除号"/",它的整数除和小数除是有区别的:整数之间做除法时,只保留整数部分而舍弃小数部分(而非四舍五入)。例如:10 / 3 = 3; 10.0 / 3 = 3.333; 18 / 5 = 3
var res int = 10 / 3 //正确 var res int = 10.0 / 3 //错误,右边计算的结果是float类型,而左边的变量是int类型,不可以赋值
-
对于一个数取模时(例如:a % b),可以等价a % b = a - a / b * b,这样我们可以看到取模的一个本质运算。-10 % 3 和10 % -3的结果是不一样的
-10 % 3 = -10 - ( -10 / 3) * 3 = -10 - (-3 * 3) = -10+9 = -1
10 % -3 = 10 - (10 / -3) * -3 = 10 - (-3) * -3 = 10 - 9 = 1
golang的自增自减只能当做一个独立语句使用,不能出现在赋值语句的右边(例如:
var res int = n++
),也不能像if i++ > 0 {}
这样使用golang的++和—只能写在变量的后面,不能写在变量的前面,即:只有a++,没有++a
golang的设计者去掉c/java中的自增自减得容易混淆的写法,让golang更加简洁、统一。(强制性的)
如何计算a%b的结果呢?
公示:a % b = a - a / b * b
-10 % 3 = -10 - ( -10 / 3) * 3 = -10 - (-3 * 3) = -10+9 = -1
10 % -3 = 10 - (10 / -3) * -3 = 10 - (-3) * -3 = 10 - 9 = 1
赋值运算符
赋值运算符就是将某个运算后的值,赋给指定的变量。
运算符 | 描述 | 实例 |
---|---|---|
= | 简单的赋值运算符,将一个表达式的值赋给一个左值 | c = a + b 将 a + b 表达式结果赋值给 c |
+= | 相加后再赋值 | c += a 等于 c = c + a |
-= | 相减后再赋值 | c -= a 等于 c = c - a |
*= | 相乘后再赋值 | c = a 等于 c = c a |
/= | 相除后再赋值 | c /= a 等于 c = c / a |
%= | 求余后再赋值 | c %= a 等于 c = c % a |
<<= | 左移后赋值 | c <<= 2 等于 c = c << 2 |
>>= | 右移后赋值 | c >>= 2 等于 c = c >> 2 |
&= | 按位与后赋值 | c &= 2 等于 c = c & 2 |
^= | 按位异或后赋值 | c ^= 2 等于 c = c ^ 2 |
|= | 按位或后赋值 | c |= 2 等于 c = c | 2 |
逻辑运算符
用于连接多个条件(一般来讲就是关系表达式),最终的结果也是一个bool值。
下表列出了所有go语言的逻辑运算符。假定 a 值为 true,b 值为 false。
运算符 | 描述 | 实例 |
---|---|---|
&& | 逻辑 and 运算符。 如果两边的操作数都是 true,则条件 true,否则为 false。 | (a && b) 为 false |
|| | 逻辑 or 运算符。 如果两边的操作数有一个 true,则条件 true,否则为 false。 | (a || b) 为 true |
! | 逻辑 not 运算符。 如果条件为 true,则逻辑 not 条件 false,否则为 true。 | !(a && b) 为 true |
短路与和短路或
&&也叫短路与:如果第一个条件为false,则第二个条件不会判断,最终结果为false
||也叫短路或:如果第一个条件为true,则第二个条件不会判断,最终结果为true
关系运算符
关系运算符的结果都是bool型,要么是true,要么是false;关系表达式经常用在if结构的条件中或循环结构的条件中
下表列出了所有go语言的关系运算符。假定 a 值为 10,b 值为 20。
运算符 | 描述 | 实例 |
---|---|---|
== | 检查两个值是否相等,如果相等返回 true 否则返回 false。 | (a == b) 为 false |
!= | 检查两个值是否不相等,如果不相等返回 true 否则返回 false。 | (a != b) 为 true |
> | 检查左边值是否大于右边值,如果是返回 true 否则返回 false。 | (a > b) 为 false |
< | 检查左边值是否小于右边值,如果是返回 true 否则返回 false。 | (a < b) 为 true |
>= | 检查左边值是否大于等于右边值,如果是返回 true 否则返回 false。 | (a >= b) 为 false |
<= | 检查左边值是否小于等于右边值,如果是返回 true 否则返回 false。 | (a <= b) 为 true |
位运算符
位运算符对整数在内存中的二进制位进行操作。(这里不理解的可以先看008.计算机进制介绍)
下表列出了位运算符 &, |, 和 ^ 的计算:
p | q | p & q | p | q | p ^ q |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 | 1 |
1 | 1 | 1 | 1 | 0 |
1 | 0 | 0 | 1 | 1 |
假定 a = 60; b = 13; 其二进制数(求它们的补码,实际上是对补码进行运算)转换为:
a = 0011 1100 b = 0000 1101 ----------------- a&b = 0000 1100 a|b = 0011 1101 a^b = 0011 0001
计算机内部采用补码进行运算
a+b a的原码为: 0011 1100 a的反码为: 0011 1100 a的补码为: 0011 1100 b的原码为: 0000 1101 b的反码为: 0000 1101 b的补码为: 0000 1101 a + b 0011 1100 0000 1101 -------------- 0100 1001 0100 1001转换为10进制整数就是73 a-b = a + (-b) a的原码为: 0011 1100 a的反码为: 0011 1100 a的补码为: 0011 1100 -b的原码为: 1000 1101 -b的反码为: 1111 0010 -b的补码为: 1111 0011 a - b = 0011 1100 1111 0011 -------------- 0010 1111 0010 1111转换为10进制整数就是47 需要注意的是如果得到的结果是正数,则补码就是原码,但是如果得到的结果是负数,则需要将补码-1取反变成原码后再转换成整数 b - a -a的原码为: 1011 1100 -a的反码为: 1100 0011 -a的补码为: 1100 0100 b的原码为: 0000 1101 b的反码为: 0000 1101 b的补码为: 0000 1101 b - a = 1100 0100 0000 1101 -------------- 1101 0001 根据补码符号位可以看出结果为负数,所以需要先-1转换为反码1101 0000,然后符号位不变,取反为原码为1010 1111即为-47
go 语言支持的位运算符如下表所示。假定 a 为60,b 为13:
运算符 | 描述 | 实例 |
---|---|---|
& | 按位与运算符"&"是双目运算符。 其功能是参与运算的两数各对应的二进位相与。 | (a & b) 结果为 12, 二进制为 0000 1100 |
| | 按位或运算符"|"是双目运算符。 其功能是参与运算的两数各对应的二进位相或 | (a | b) 结果为 61, 二进制为 0011 1101 |
^ | 按位异或运算符"^"是双目运算符。 其功能是参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。 | (a ^ b) 结果为 49, 二进制为 0011 0001 |
<< | 左移运算符"<<"是双目运算符。左移n位就是乘以2的n次方。 其功能把"<<"左边的运算数的各二进位全部左移若干位,由"<<"右边的数指定移动的位数,高位丢弃,低位补0。 | a << 2 结果为 240 ,二进制为 1111 0000 |
>> | 右移运算符">>"是双目运算符。右移n位就是除以2的n次方。 其功能是把">>"左边的运算数的各二进位全部右移若干位,">>"右边的数指定移动的位数。 | a >> 2 结果为 15 ,二进制为 0000 1111 |
package main import "fmt" func main() { var a uint = 60 /* 60 = 0011 1100 */ var b uint = 13 /* 13 = 0000 1101 */ var c uint = 0 c = a & b /* 12 = 0000 1100 */ fmt.printf("第一行 - c 的值为 %d\n", c ) c = a | b /* 61 = 0011 1101 */ fmt.printf("第二行 - c 的值为 %d\n", c ) c = a ^ b /* 49 = 0011 0001 */ fmt.printf("第三行 - c 的值为 %d\n", c ) c = a << 2 /* 240 = 1111 0000 */ fmt.printf("第四行 - c 的值为 %d\n", c ) c = a >> 2 /* 15 = 0000 1111 */ fmt.printf("第五行 - c 的值为 %d\n", c ) }
第一行 - c 的值为 12 第二行 - c 的值为 61 第三行 - c 的值为 49 第四行 - c 的值为 240 第五行 - c 的值为 15
其他运算符
下表列出了go语言的其他运算符。
运算符 | 描述 | 实例 |
---|---|---|
& | 返回变量存储地址 | &a; 将给出变量的实际地址。 |
* | 指针变量。 | *a; 是一个指针变量 |
运算符优先级
运算符有不同的优先级,所谓优先级就是表达式运算中的运算顺序。如下表,上一行运算符的优先级总是优于下一行。
只有单目运算符、赋值运算符是从右向左运算的。
分类 | 描述 | 关联性 |
---|---|---|
后缀 | () [] -> . ++ -- | 左到右 |
单目 | + - ! ~ (type) * & sizeof | 右到左 |
乘法 | * / % | 左到右 |
加法 | + - | 左到右 |
移位 | << >> | 左到右 |
关系 | < <= > >= | 左到右 |
相等 | == != | 左到右 |
按位and | & | 左到右 |
按位xor | ^ | 左到右 |
按位or | | | 左到右 |
逻辑and | && | 左到右 |
逻辑or | || | 左到右 |
赋值运算符 | = += -= *= /= %= >>= <<= &= ^= |= | 右到左 |
逗号 | , | 左到右 |
说明:go语言不支持三元运算符。
golang设计理念
一种事情有且只有一种方法完成
上一篇: asp javascript在线管理
下一篇: 春季养肝吃12种蔬菜