原文链接:https://xiets.blog.csdn.net/article/details/130864686
版权声明:原创文章禁止转载
专栏目录:Golang 专栏(总目录)
Go 程序中参与数学运算的数值类型必须完全相同,如果类型不同,必须先转换为相同的类型。如果是变量,需要显式转换;如果是字面量,会自动隐式转换。
// 定义两个不同类型的整数
var a int = 2
var b int32 = 3
c1 := a + b // 编译报错, 因为 a 和 b 的类型不相同
c2 := int32(a) + b // 编译通过, a 被转换为 int32 类型, 再与同是 int32 类型的 b 相加
c3 := 5 + b // 编译通过, 5 被隐式转换为 int32 类型
1. 算术运算
运算符 描述 示例
--------------------------------------------------------------------------
+ 加法 2 + 3 == 5; "ab" + "cd" == "abcd"
- 减法 5 - 2 == 3
* 乘法 2 * 3 == 6; 2 * 3.0 == 6.0
/ 除法 3 / 2 == 1; 3 / 2.0 == 1.5
% 取模 5 % 3 == 2; 5 % -3 == 2; -5 % 3 == -2; -5 % -3 == -2
--------------------------------------------------------------------------
- 除法
/
运算,如果两个操作数是整数,则结果只取整数部分 (且结果为整数)。 - 取模
%
运算,只能用于整数,取模余数的正负符号因编程语言而异。在 Go 中,取模余数的正负符号总与被除数(%左边的数)一致。例如,-5 % 3 == -2
、-5 % -3 == -2
、5 % -3 == 2
。 - 算术运算的结果如果超出对应数值类型的值范围,称为 溢出。溢出的高位部分会无提示丢弃。
2. 赋值运算
运算符 描述 示例
--------------------------------------------------------
= 简单赋值 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 <<= a 等价于 c = c << a
>>= 右移赋值 c >>= a 等价于 c = c >> a
&= 位与赋值 c &= a 等价于 c = c & a
^= 异或赋值 c ^= a 等价于 c = c ^ a
|= 位或赋值 c |= a 等价于 c = c | a
++ 自增赋值 a++ 等价于 a += 1, 等价于 a = a + 1
-- 自减赋值 a-- 等价于 a -= 1, 等价于 a = a - 1
--------------------------------------------------------
3. 比较运算
比较运算 表达式的结果为 bool
类型 (true
or false
)。
运算符 描述 示例
-----------------------------------------------------------------
== 相等 2 == 2 结果为 true
!= 不相等 "abc" != "abc" 结果为 false
> 大于 3 > 2 结果为 true; "xyz" > "abc" 结果为 true
< 小于 3 < 2 结果为 false
>= 大于等于 3 >= 3 结果为 true
<= 小于等于 8 <= 5 结果为 false
-----------------------------------------------------------------
4. 逻辑运算
逻辑运算 表达式的结果为 bool
类型 (true
or false
)。
运算符 描述 示例
-----------------------------------------------------------------
&& 逻辑与 a && b, a 和 b 为布尔表达式
|| 逻辑或 a || b
! 逻辑非 !a
-----------------------------------------------------------------
5. 位运算
运算符 描述 示例
---------------------------------------------------------------------------
& 位与 a & b, 整数a 和 整数b 按位与运算
| 位或 a | b, 整数a 和 整数b 按位或运算
^ 异或 a ^ b, 整数a 和 整数b 按位异或运算
^ 取反 ^a, 对 整数a 按位取反
<< 左移 a << 1, 整数a 左移 1 位, 00000111 << 1 结果为 00001110
>> 右移 a >> 1, 整数a 右移 1 位, 00000111 >> 1 结果为 00000011
---------------------------------------------------------------------------
许多编程语言中使用波浪线~
作为 按位取反 的操作符,Go 语言重用了按位异或操作符^
。如果^
用于二元运算(如 a ^ b
),则表示 按位异或;如果^
用于一元运算(如 ^a
),则表示 按位取反。
正负数的左移右移(正负符号位也一起移动):
<<
左移:左移(右边)低位补0。>>
右移:正数右移,(左边)高位补0;负数右移,(左边)高位补1。
6. 其他运算符
运算符 描述 示例
------------------------------------------------------------------------------
& 取地址 p = &a, 取变量a的地址赋值给指针变量p, 指针p 指向 变量a
* 解引用 a = *p, 引用指针p指向的变量, 取出指针p指向的变量值赋值给变量a
------------------------------------------------------------------------------
&
和 *
运算符在二元运算时表示 位与 和 乘法,一元运算时表示 取地址 和 解引用。
7. 运算符优先级
Go 语言常用运算符优先级(从高到低优先级排列):
# | 分类 | 运算符 | 运算方向 |
---|---|---|---|
1 | 括号 | () , [] | 从左到右 |
2 | 从通道取值 | <- | 从右到左 |
3 | 属性/成员访问(点) | . | 从左到右 |
4 | 一元运算(单目运算) | ! , * (解引用), & (取地址), ++ , -- , + (正号), - (负号) | 从右到左 |
5 | 乘除/取模 | * (乘号), / , % | 从左到右 |
6 | 加减 | + (加号), - (减号) | 从左到右 |
7 | 位移 | << , >> | 从左到右 |
8 | 比较运算(大小比较) | < , <= , > , >= | 从左到右 |
9 | 比较运算(相等比较) | == , != | 从左到右 |
10 | 位运算(位与) | & (位与) | 从左到右 |
11 | 位运算(异或) | ^ (异或) | 从左到右 |
12 | 位运算(位或) | ` | ` |
13 | 逻辑运算(与) | && | 从左到右 |
14 | 逻辑运算(或) | ` | |
15 | 赋值运算 | = , += , -= , *= , /= , %= , <<= , >>= , &= , ^= , ` | =` |
16 | 逗号 | , | 从左到右 |