Go语言学习之运算符|Go主题月

1,226 阅读6分钟

作者:看那个码农

公众号:看那个码农

上期内容介绍了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)

}

输出为:

image.png

特别注意:

  • 在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)
}

输出为:

image.png

正确的写法为

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)
}

输出为:

image.png

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)
}

输出为:

image.png

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")
   }

}

输出为:

image.png

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次方
}

输出为:

image.png

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、关注公众号:看那个码农,我们一起学习一起进步。