作者:看那个码农
公众号:看那个码农
上期内容介绍了Go语言学习之力扣-旋转链表|Go主题月
- 旋转链表
本篇内容将继续带领大家走进Go语言的世界。
1.本文简介
运算符优先级,是描述在计算机运算计算表达式时执行运算的先后顺序。 先执行具有较高优先级的运算,然后执行较低优先级的运算。例如,我们常说的先执行相乘和除,再执行加减运算。
Go语言内置的运算符
- 算术运算符
- 关系运算符
- 逻辑运算符
- 位运算符
- 赋值运算符
- 其他运算符
2.算术运算符
1. 算数运算符“+”
对两个操作数进行相加操作。
2. 算数运算符“-”
对两个操作数进行相减操作。
3. 算数运算符“*”
对两个操作数进行相乘操作。
4. 算数运算符“/”
对两个操作数进行相除操作。
5. 算数运算符“%”
对两个操作数进行相除取余操作。
6. 算数运算符“++”
增加(递增)运算符,将整数值加一。
7. 算数运算符“--”
增加(递增)运算符,将整数值减一。
8.算术运算符代码演示
具体代码如下面案例所示:
package main
import (
"fmt"
)
func main(){
var nodeA int=10
var nodeB int=20
fmt.Printf("nodeA+nodeB=%v\n",nodeA+nodeB)
fmt.Printf("nodeA-nodeB=%v\n",nodeA-nodeB)
fmt.Printf("nodeA*nodeB=%v\n",nodeA*nodeB)
fmt.Printf("nodeA/nodeB=%v\n",nodeA/nodeB)
fmt.Printf("nodeA%%nodeB=%v\n",nodeA%nodeB)
nodeA++
nodeB--
fmt.Printf("nodeA++=%v\n",nodeA)
fmt.Printf("nodeB--=%v\n",nodeB)
}
输出为:
特别注意:
- 在Go语言中
++
和--
只能作为语句而非表达式
a := 1
a ++ // 注意:不能写成 ++ a 或 -- a 必须放在右边使用
// b := a++ // 此处为错误的用法,不能写在一行,要单独作为语句使用
不能
使用++自增
或- -自减
运算符初始化变量和对变量赋值 例如下面这个案例是错误案例,编译器会报错:
package main
import "fmt"
func main(){
var a int = 10
var b int = a++
var c int = 20
c = a++
fmt.Print(a, b, c)
}
输出为:
正确的写法为:
package main
import "fmt"
func main(){
var a int = 10
var b int = 10
var c int
a++
c=a
fmt.Print(a, b, c)
}
输出为:
3.关系运算符
1.关系运算符“==”
检查两个操作数的值是否相等,如果相等,则条件为真。
2.关系运算符“!=”
检查两个操作数的值是否相等,如果值不相等,则条件为真。
3.关系运算符“>”
检查左操作数的值是否大于右操作数的值,如果是,则条件为真。
4.关系运算符“<”
检查左操作数的值是否小于右操作数的值,如果是,则条件为真。
5.关系运算符“>=”
检查左操作数的值是否大于或等于右操作数的值,如果是,则条件为真。
6.关系运算符“<=”
检查左操作数的值是否小于或等于右操作数的值,如果是,则条件为真。
7.关系运算符代码演示
具体代码如下面案例所示:
package main
import (
"fmt"
)
func main(){
var nodeA int=10
var nodeB int=20
fmt.Printf("nodeA==nodeB吗?答案是%v\n",nodeA==nodeB)
fmt.Printf("nodeA!=nodeB吗?答案是%v\n",nodeA!=nodeB)
fmt.Printf("nodeA>nodeB吗?答案是%v\n",nodeA>nodeB)
fmt.Printf("nodeA<nodeB吗?答案是%v\n",nodeA<nodeB)
fmt.Printf("nodeA>=nodeB吗?答案是%v\n",nodeA>=nodeB)
fmt.Printf("nodeA<=nodeB吗?答案是%v\n",nodeA<=nodeB)
}
输出为:
4.逻辑运算符
1.逻辑运算符“&&”
逻辑AND
运算符。如果两个操作数都不为零,则条件为真。
2.逻辑运算符“||”
逻辑OR
运算符。如果两个操作数中的任何一个非零,则条件变为真。
3.逻辑运算符“!”
逻辑非
运算符。用于反转其操作数的逻辑状态。如果条件为真,则逻辑非运算符将为假。
4.逻辑运算符代码演示
具体代码如下面案例所示:
package main
import (
"fmt"
)
func main(){
var nodeA bool=true
var nodeB bool=false
if nodeA&&nodeB{
fmt.Println("nodeA&&nodeB为true")
}else{
fmt.Println("nodeA&&nodeB为false")
}
if nodeA||nodeB{
fmt.Println("nodeA||nodeB为true")
}else{
fmt.Println("nodeA||nodeB为false")
}
if !(nodeA||nodeB){
fmt.Println("!(nodeA||nodeB)为true")
}else{
fmt.Println("!(nodeA||nodeB)为false")
}
}
输出为:
5.位运算符
位运算符对整数在内存中的二进制位进行操作。
1.位运算符“&”
按位与运算符"&
"是双目运算符。 其功能是参与运算的两数各对应的二进位相与。
2.位运算符“|”
按位或运算符"|
"是双目运算符。 其功能是参与运算的两数各对应的二进位相或
3.位运算符“^”
按位异或运算符"^
"是双目运算符。 其功能是参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。
4.位运算符“<<”
左移运算符"<<
"是双目运算符。左移n位就是乘以2的n次方。 其功能把"<<
"左边的运算数的各二进位全部左移若干位,由"<<
"右边的数指定移动的位数,高位丢弃,低位补0。
5.位运算符“>>”
右移运算符">>
"是双目运算符。右移n位就是除以2的n次方。 其功能是把">>
"左边的运算数的各二进位全部右移若干位,">>
"右边的数指定移动的位数。
6.位运算符代码演示
package main
import "fmt"
func main() {
var a int = 4 //二进制是:100
var b int = 8 //二进制是:1000
fmt.Printf("a&b的值为:%v\n",a&b) //二进制是:000,对应的十进制是0。说明&进行的是上下对应位的与操作
fmt.Printf("a|b的值为:%v\n",a|b) //二进制是:1100,对应的十进制是12。说明&进行的是上下对应位的或操作
fmt.Printf("a^b的值为:%v\n",a^b) //二进制是:1100,对应的十进制是12。^位运算符是上下对应位不同时,值为1
fmt.Printf("a<<2的值为:%v\n",a<<2) //二进制是:10000,对应的十进制是16。<<左移n位就是乘以2的n次方
fmt.Printf("b>>1的值为:%v\n",b>>1) //二进制是:100,对应的十进制是4。>>移移n位就是除以2的n次方
}
输出为:
5.赋值运算符
1.赋值运算符“=”
简单赋值操作符,将值从右侧操作数分配给左侧操作数。
2.赋值运算符“+=”
相加和赋值运算符,向左操作数添加右操作数,并将结果赋给左操作数。
c+=a
fmt.Printf("c+=a的值为:%v\n",c)
3.赋值运算符“-=”
减去和赋值运算符,从左操作数中减去右操作数,并将结果赋给左操作数。
c-=a
fmt.Printf("c-=a的值为:%v\n",c)
4.赋值运算符“*=”
乘法和赋值运算符,它将右操作数与左操作数相乘,并将结果赋给左操作数。
c*=a
fmt.Printf("c*=a的值为:%v\n",c)
5.赋值运算符“/=”
除法和赋值运算符,它用右操作数划分左操作数,并将结果分配给左操作数。
c/=a
fmt.Printf("c/=a的值为:%v\n",c)
6.赋值运算符“%=”
模数和赋值运算符,它使用两个操作数来取模,并将结果分配给左操作数。
c%=a
fmt.Printf("c%%=a的值为:%v\n",c)
7.赋值运算符“<<=”
左移和赋值运算符。
c<<=1
fmt.Printf("c<<=1的值为:%v\n",c)
8.赋值运算符“>>=”
右移和赋值运算符。
c>>=1
fmt.Printf("c>>=1的值为:%v\n",c)
9.赋值运算符“&=”
按位和赋值运算符。
c&=a
fmt.Printf("c&=a的值为:%v\n",c)
10.赋值运算符“^=”
按位异或和赋值运算符。
c^=a
fmt.Printf("c^=a的值为:%v\n",c)
11.赋值运算符“|=”
按位包含OR
和赋值运算符。
c|=a
fmt.Printf("c|=a的值为:%v\n",c)
6.其他运算符
1.运算符“&”
返回变量的地址。
&a
将给出变量a的实际地址。
2.运算符“*”
指向变量的指针。
*a
是指向变量a的指针。
7.运算符优先级
运算符优先级确定表达式中的分组。这会影响表达式的计算方式。
某些运算符比其他运算符具有更高的优先级。
例如:乘法除法
运算符比加法减法
运算符有更高的优先级。
总结如下表:
优先级 | 分类 | 运算符 | 结合性 |
---|---|---|---|
1 | 逗号运算符 | , | 从左到右 |
2 | 赋值运算符 | =、+=、-=、*=、/=、 %=、 >=、 <<=、&=、^=、l= | 从右到左 |
3 | 逻辑或 | ll | 从左到右 |
4 | 逻辑与 | && | 从左到右 |
5 | 按位或 | l或操作 | 从左到右 |
6 | 按位异或 | 从左到右 | |
7 | 按位与 | & | 从左到右 |
8 | 相等/不等 | ==、!= | 从左到右 |
9 | 关系运算符 | <、<=、>、>= | 从左到右 |
10 | 位移运算符 | <<、>> | 从左到右 |
11 | 加法/减法 | +、- | 从左到右 |
12 | 乘法/除法/取余 | *(乘号)、/、% | 从左到右 |
13 | 单目运算符 | !、*(指针)、& 、++、--、+(正号)、-(负号) | 从右到左 |
14 | 后缀运算符 | ( )、[ ]、-> | 从左到右 |
注意:优先级值越大,表示优先级越高!
注意:优先级值越大,表示优先级越高!!
注意:优先级值越大,表示优先级越高!!!
如果你觉得这篇内容对你有帮助的话:
1、点赞支持下吧,让更多的人也能看到这篇内容
2、关注公众号:看那个码农,我们一起学习一起进步。