持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第7天,点击查看活动详情
一、运算符介绍
运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等
- 算术运算符
- 赋值运算符
- 比较运算符/关系运算符
- 逻辑运算符
- 位运算符
- 其他运算符
二、算术运算符
算术运算符是对数值类型的变量进行运算的,比如:加诚乘除
| 运算符 | 运算 | 范例 | 结果 |
|---|---|---|---|
| + | 正号 | +1 | 1 |
| - | 负号 | -1 | -1 |
| + | 加 | 1+1 | 2 |
| - | 减 | 1-1 | 0 |
| * | 乘 | 2*2 | 4 |
| / | 除 | 2/2 | 1 |
| % | 取模(余) | 10%5 | 0 |
| ++ | 自增 | a=1 a++ | a=2 |
| -- | 自减 | a=3 a-- | a=2 |
| + | 字符串相加 | a="hello" b="world" a+b | "helloworld" |
package main
import "fmt"
func main() {
// 除法演示
// 参与运算双方都为整数,运算结果去掉小数部分,保留整数部分
fmt.Println(10 / 4) // 输出为 2
fmt.Println(float32(10 / 4)) // 依旧输出为2
// 保留小数部分
// 取决于参与运算部分是否有浮点数
fmt.Println(float32(10.0 / 4)) // 输出为 2.5
// 取模
// 取模公式 a % b = a - a / b * b
fmt.Println("10 % 3 =", 10%3)
fmt.Println("-10 % 3 =", -10%3)
fmt.Println("10 % -3 =", 10%-3)
fmt.Println("-10 % -3 =", -10%-3)
// ++ 和 -- 使用案例
//注意 自增自减只能作为独立语言使用
// 错误语法 --> b := a++
// 没有 ++a --a
var a int = 1
a++ // a = a + 1
fmt.Println("a=", a) //2
a-- // a = a - 1
fmt.Println("a=", a) //1
}
2.1 案例一 天数转换
package main
import "fmt"
func main() {
// 还有100天放假,请换算为 xx周xx天
var days int = 100
var weeks int = days / 7
var ext_day int = days % 7
fmt.Printf("还有 %v 周零 %v 天\n", weeks, ext_day)
}
2.2 案例二 温度转换
package main
import "fmt"
func main() {
// 将华氏温度转换为摄氏度
// 公式 5/9*(华氏温度-100)
var fad float64 = 150
// 如果写成 5 那么结果会一直为 0
var cent float64 = 5.0 / 9 * (fad - 100)
fmt.Printf("%v 华氏度对应的摄氏度为: %v", fad, cent)
}
三、关系运算符/比较运算符
- 关系运算符的结果都是bool型,要么是true,要么是false
- 关系表达式经常用在if结构的条件中或循环结构的条件中
| 运算符 | 运算 | 范例 | 结果 |
|---|---|---|---|
| == | 相等 | 1 == 2 | false |
| != | 不等 | 1 != 2 | true |
| < | 小于 | 1 < 2 | true |
| > | 大于 | 1 > 2 | false |
| <= | 小于等于 | 1 <= 2 | true |
| >= | 大于等于 | 1 >= 2 | false |
package main
import "fmt"
func main() {
// 定义两个变量
var a int = 1
var b int = 2
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
}
四、逻辑运算符
用于连接多个条件(一般来讲就是关系表达式),最终的结果也是一个bool值。
若 A=True B=False
| 运算符 | 描述 | 范例 | 备注 |
|---|---|---|---|
| && | 逻辑与运算符。如果两边的操作数都是True;则为True,否则为False | (A&&B) 得到false | 有假即假 |
| || | 逻辑或运算符。如果两边的操作数有一个True,则为True,否则为False | (A||B) 得到 true | 有真即真 |
| ! | 逻辑非运算符。如果条件为True,则逻辑为False,否则为True | !(A&&B) 得到true | 取反 |
package main
import "fmt"
func main() {
var a bool = true
var b bool = false
fmt.Println(a && b) // false
fmt.Println(a || b) // true
fmt.Print(!(a && b)) // true
}
4.1 注意事项
- &&也叫短路与:如果第一个条件为false,则第二个条件不会判断,最终结果为false
- || 也叫短路或: 如果第一个条件为true, 则第二个条件不会判断,最终结果为true
五、赋值运算符
赋值运算符就是将某个运算后的值,赋给指定的变量
| 运算符 | 描述 | 实例 |
|---|---|---|
| = | 简单的赋值运算符,将一个表达式的值赋给一个左值 | a = b + c 将 b+c的结果赋值给 a |
| += | 相加后再赋值 | 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 <<= 2 --> a = a << 2 |
| >>= | 右移后赋值 | a >>= 2 --> a = a >> 2 |
| &= | 按位与后赋值 | a &= 2 --> a = a & 2 |
| ^= | 按位异或后赋值 | a ^= 2 --> a = a ^ 2 |
| |= | 按位或后赋值 | a |= 2 --> a = a | 2 |
package main
import "fmt"
func test() int {
return 90
}
func main() {
// 基本赋值
var a int
a = 1
fmt.Println("a = ", a)
// 交换变量值
m := 10
n := 20
//定义临时变量
t := m
m = n // m = 20
n = t // n = 10
fmt.Printf("m = %v, n = %v\n", m, n)
// 复合赋值
a += 10 // a = a + 10
fmt.Println("a = ", a)
// 赋值运算执行顺序 从右往左
b := a + 10
fmt.Println("b = ", b)
// 赋值表达式左侧 只能为 变量。 右侧可以为 变量/表达式/常量值
// 表达式:任何有值的都可以看作表达式
var d int
d = a
d = 8 + 8*8 // 右侧为表达式
d = test() + 10 // 右侧为表达式
d = 10086 // 常量
fmt.Println("d = ", d)
}
5.1 案例一 交换变量值
交换变量a,b的值,不能使用中间变量,打印出最终结果
package main
import "fmt"
func test() int {
return 90
}
func main() {
// 方法1
j := 10
k := 20
j, k = k, j
fmt.Printf("j = %v, k = %v\n", j, k)
//法2
j1 := 10
k1 := 20
j1 += k1 // j1 = 30
k1 = j1 - k1 // k1 = 20
j1 -= k1 // j1 = 20
fmt.Printf("j1 = %v, k1 = %v\n", j1, k1)
}
六、位运算符
| 运算符 | 描述 | 运算规则 |
|---|---|---|
| & | 按位与运算符"&"是双目运算符。其功能是参与运算的两数各对应的二进位相与。 | 运算规则是:同时为1 ,结果为1,否则为0 |
| | | 按位或运算符"是双目运算符。其功能是参与运算的两数各对应的二进位相或 | 运算规则是:有一个为1,结果为1,否则为0 |
| ^ | 按位异或运算符"^"是双目运算符。其功能是参与运算的两数各对应的二进位相异或 | 运算规则是:当二进位不同时,结果为1,否则为0 |
| << | 左移运算符"<<"是双目运算符。其功能把"<<"左边的运算数的各二进位全部左移若干位,高位丢弃,低位补0。左移n位就是乘以2的n次方 | |
| >> | 右移运算符">>"是双目运算符。其功能是把">>"左边的运算数的各二进位全部右移若干位右移n位就是除以2的n次方 |
七、其他运算符
| 运算符 | 描述 | 实例 |
|---|---|---|
| & | 返回变量存储地址 | &i,取i在内存中的地址 |
| * | 指针变量 | *prt,表示一个指针变量 ptr |
package main
import (
"fmt"
)
func main() {
// 查看 i 的地址
var i int = 1
fmt.Println("a 地址为: ", &i)
// 指针变量
var ptr *int = &i
fmt.Println("ptr = ", *ptr) // ptr 为 1
// 不支持三元运算,使用if-else代替
var o int
var n int = 10
var m int = 20
if n > m {
o = n
} else {
o = m
}
fmt.Println("o = ", o)
}
八、三元运算
Go语言明确说明不支持三元运算,请使用if-else代替
九、案例演示
package main
import "fmt"
func main() {
// 两数求最大
var n1 int = 10
var n2 int = 20
var max int
if n1 > n2 {
max = n1
} else {
max = n2
}
fmt.Println("max = ", max)
// 三个数求最大值
var n3 = 30
if max < n3 {
max = n3
}
fmt.Println("max = ", max)
}