运算符和表达式

145 阅读2分钟

算数运算符

符号 名称
+
-
*
/
%
++ 自增
-- 自减

关系运算符

符号 名称
== 等于
!= 不等于
> 大于
< 小于
>= 大于等于
<= 小于等于

逻辑运算符

符号 名称
&& 逻辑与
|| 逻辑或
! 逻辑非

位运算符

位运算符对整数在内存中的二进制位进行操作

aba & ba|ba ^ b
00000
01011
11110
10011

赋值运算符

符号 名称
= 将表达式结果赋给左值
+= 相加后再赋值
-= 相减后再赋值
... ...

其他

  • 返回变量存储地址:&
  • 指针变量:*

运算符优先级

可以通过括号来提升某个表达式的整体运算优先级

优先级 分类 运算符 结合性
01 逗号运算符 , 从左到右
02 赋值运算符 =、+=、-=、*=、/=、%=、>>=、<<=、&=、|=、^= 从右到左
03 逻辑或 || 从左到右
04 逻辑与 && 从左到右
05 按位或 | 从左到右
06 按位异或 ^ 从左到右
07 按位与 & 从左到右
08 相等/不等 ==、!= 从左到右
09 关系运算符 <、<=、>、>= 从左到右
10 位移运算符 <<、>> 从左到右
11 加法/减法 +、- 从左到右
12 乘法/除法/取余 *(乘号)、/、% 从左到右
13 单目运算符 !、*(指针)、& 、++、--、+(正号)、-(负号) 从右到左
14 后缀运算符 ( )、[ ]、-> 从左到右

代码示例

package main

import "fmt"

func main() {
    // 运算符
    var a, b = 5, 3
    fmt.Println(a + b) // 加 8
    fmt.Println(a - b) // 减 2
    fmt.Println(a * b) // 乘 15
    fmt.Println(a / b) // 除 1
    fmt.Println(a % b) // 余 2

    // + 号:字符串拼接
    var s1, s2 = "Hello", "World"
    s := fmt.Sprintf("%v", s1+s2)
    fmt.Println(s) // HelloWorld

    // 自增或自减
    var i int // 0
    i++       // 1
    i += 1    // 2
    i = i + 1 // 3
    i = i - 1 // 2
    i -= 1    // 1
    i--       // 0

    // 逻辑运算符
    var v1, v2 = true, false
    if v1 && v2 {
       fmt.Println("always false")
    }
    if v1 || v2 {
       fmt.Println("always true")
    }
    if !v1 {
       fmt.Println("always false")
    }

    // 位运算符(一般对性能要求高的时候,才会考虑位运算)
    var n1 = 60          // 0011 1100
    var n2 = 13          // 0000 1101
    fmt.Println(n1 & n2) // 0000 1100 -> 与运算   12 (2^3 + 2^2)
    fmt.Println(n1 | n2) // 0011 1101 -> 或运算   61 (2^5 + 2^4 + 2^3 + 2^2 + 2^0)
    fmt.Println(n1 ^ n2) // 0011 0001 -> 异或运算 49 (2^5 + 2^4 + 2^0)
}