运算符基本介绍
运算符是一种特殊的符号,用以表示数据的运算,赋值和比较等
- 算术运算符
- 赋值运算符
- 比较运算符/关系运算符
- 逻辑运算符
- 位运算符
- 其它运算符
算术运算符
算术运算符是对数值类型的变量进行运算的
运算符 | 运算 | 示例 | 结果 |
---|---|---|---|
+ | 正号 | +3 | 3 |
- | 负号 | -4 | -4 |
+ | 加 | 5+5 | 10 |
- | 减 | 6-4 | 2 |
* | 乘 | 3*4 | 12 |
/ | 除 | 5/5 | 1 |
% | 取模(取余) | 7%5 | 2 |
++ | 自增 | a=2 a++ | a=3 |
– | 自减 | a=2 a– | a=1 |
+ | 字符串相加 | “he”+“llo” | “hello” |
package main
import (
"fmt"
)
func main() {
fmt.Println(10 / 4)
var n1 float32 = 10 / 4
fmt.Println(n1)
//希望保留小数,则需要有浮点数参与运算
var n2 float32 = 10.0 /4
fmt.Println(n2)
fmt.Println(10%3)
fmt.Println(-10%3)
fmt.Println(10%-3)
fmt.Println(-10%-3)
}
运行结果
2
2
2.5
1
-1
1
-1
func main() {
var i int = 10
i++
fmt.Println("i=", i)
i--
fmt.Println("i=", i)
}
算术运算符使用的注意事项
- 对于除号 / , 它的整数除和小数除是有区别的: 整数之间做除法,只保留整数部分
- 当对一个数取模时, 可以等价 a%b=a-a/b*b
- golang的自增自减只能当做一个独立语言使用
package main
import (
"fmt"
)
func main() {
var i int = 10
var a int
a = i++ // 错误
a = i-- // 错误
fmt.Println("a=", a)
if i++ > 0 { //错误
fmt.Println("ok")
}
}
-
golang的 ++ 和 – 只能卸载变量的后面, 即: 只有 a++ 和 a–
-
golang 的设计者去掉c/java中的自增自减的容易混淆的写法,让golang更加简洁,统一(强制性的)
func main() {
var days int = 97
var week int = days / 7
var day int = days % 7
fmt.Printf("%d个星期零%d天\n", week, day)
var h float32 = 134.2
var s float32 = 5.0 /9 * (h - 100)
fmt.Printf("%v 对应的摄氏温度=%v", h, s)
}
关系运算符(比较运算符)
- 关系运算符的结果都是bool型
- 关系表达式 用于条件或循环中
运算符 | 运算 | 示例 | 结果 |
---|---|---|---|
== | 等于 | 4==3 | false |
!= | 不等于 | 4!=3 | true |
< | 小于 | 4<3 | false |
> | 大于 | 4>3 | true |
<= | 小于等于 | 4<=3 | false |
>= | 大于等于 | 4>=3 | true |
func main() {
var n1 int = 9
var n2 int = 8
fmt.Println(n1 == n2)
fmt.Println(n1 != n2)
fmt.Println(n1 > n2)
fmt.Println(n1 >= n2)
fmt.Println(n1 < n2)
fmt.Println(n1 <= n2)
flag := n1 > n2
fmt.Println("flag=", flag)
}
运行结果
false
true
true
true
false
false
flag= true
逻辑运算符
- 用于连接多个条件(一般就是关系表达式),最终的结果也是一个bool值
运算符 | 含义 |
---|---|
&& | 与 |
|| | 或 |
! | 非 |
func main() {
var age int = 40
if age > 30 && age < 50 {
fmt.Println("ok1")
}
if age > 30 && age < 40 {
fmt.Println("ok2")
}
if age > 30 || age < 50 {
fmt.Println("ok3")
}
if age > 30 || age < 40 {
fmt.Println("ok4")
}
if age > 30 {
fmt.Println("ok5")
}
if !(age > 30) {
fmt.Println("ok6")
}
}
运行结果
ok1
ok3
ok4
ok5
逻辑运算符注意事项
- &&也叫短路与: 如果第一个条件为false,则第二个条件不会判断,最终为false
- || 也叫短路或: 如果第一个条件为true,则第二个条件不会判断,最终为true
package main
import (
"fmt"
)
func test() bool {
fmt.Println("test...")
return true
}
func main() {
var i int = 10
if i < 9 && test() {
fmt.Println("ok...")
}
if i > 9 || test() {
fmt.Println("hello...")
}
}
赋值运算符
赋值运算符就是将某个运算后的值,赋给指定的变量
运算符 | 示例 | 含义 |
---|---|---|
= | 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 |
func main() {
var i int
i = 10
fmt.Println("i=", i)
a := 9
b :=2
fmt.Printf("交换前的情况是 a=%v, b=%v \n", a, b)
t := a
a = b
b = t
fmt.Printf("交换后的情况是 a=%v, b=%v \n", a, b)
a += 17
fmt.Println("a=", a)
}
赋值运算符的特点
- 运算顺序从右往左
- 赋值运算符的左边只能是变量,右边可以是变量,表达式,常量值
右两个变量,a和b, 要求将其进行交换,但是不允许使用中间变量
func main() {
var a int = 10
var b int = 20
fmt.Printf("a=%v, b=%v\n", a, b)
a = a + b
b = a - b
a = a - b
fmt.Printf("a=%v, b=%v\n", a, b)
}
位运算符
运算符 | 含义 |
---|---|
& | 按位与 双目运算符 有0得0,全1得1 |
| | 按位或 双目运算符 有1得1,全0得0 |
^ | 按位异或 双目运算符 |
<< | 左移运算符 双目运算符 |
>> | 右移运算符 双目运算符 |
其它运算符
运算符 | 含义 | 实例 |
---|---|---|
& | 返回变量存储地址 | &a 将给出变量的实际地址 |
* | 指针变量 | *a 是一个指针变量 |
func main() {
a := 100
fmt.Println("a的地址=", &a)
var ptr *int = &a
fmt.Println("ptr 指向的值是=", *ptr)
}
求两个数的最大值
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)
}
求三个数的最大值
func main() {
var n1 int = 10
var n2 int = 20
var n3 int = 50
var max int
if n1 > n2 {
max = n1
} else {
max = n2
}
if n3 > max {
max = n3
}
fmt.Println("三个数中最大值是", max)
}
特殊说明
go语言明确不支持三元运算符
golang的设计理念: 一种事情有且只有一种方法完成
运算符的优先级
分类 | 对应符号 | 关联性 |
---|---|---|
后缀 | () [] -> . ++ – | 左到右 |
单目 | + - ! ~ (type)* & sizeof | 右到左 |
乘法 | * / % | 左到右 |
加法 | + - | 左到右 |
移位 | << >> | 左到右 |
关系 | < <= > >= | 左到右 |
相等(关系) | == != | 左到右 |
按位与 | & | 左到右 |
按位异或 | ^ | 左到右 |
按位或 | | | 左到右 |
逻辑与 | && | 左到右 |
逻辑或 | || | 左到右 |
赋值运算符 | = += -= *= /= %= >>= <<= &= ^= |= | 右到左 |
逗号 | , | 左到右 |
- 运算符有不同的优先级,所谓优先级就是表达式运算中的运算顺序
- 只有单目运算符, 赋值运算符是从右到左运算的