【Go】运算符

运算符是一种特殊的符号,用来表示数据的运算、赋值和比较等。Go语言内置的运算符有:算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符。

算术运算符

运算符描述
+相加
-相减
*相乘
/相除
%求余
  • 除号/运算符的使用特点
package main

import "fmt"

func main() {
	// 如果运算符两边都是整数,那么运算后会直接去掉小数部分,只保留整数部分
	fmt.Println(10 / 4) // 2

	// 如果我们希望保留小数部分,则需要有浮点数参与运算
	fmt.Println(10.0 / 4) // 2.5
}

  • 取模%运算符的使用特点
package main

import "fmt"

func main() {
	// 取模运算公式:a % b = a - a / b * b
	fmt.Println(10 % 3)   // 1
	fmt.Println(10 % -3)  // 1
	fmt.Println(-10 % 3)  // -1
	fmt.Println(-10 % -3) // -1
	// 总结:取模后结果的符号由运算符左边决定
}

  • 自增++和自减--运算符的使用特点
package main

import "fmt"

func main() {
	var a = 1
	// 注意:自增和自减在Go语言中是单独的语句(语句需要单独写在一行),并不是运算符
	// 由于独占一行,此时前置和后置就没有了区别,所以Go中没有前置++和前置--
	a++
	fmt.Println(a) // 2
	a--
	fmt.Println(a) // 1
}

关系运算符

运算符描述
==检查两个值是否相等,如果相等返回 True 否则返回 False
!=检查两个值是否不相等,如果不相等返回 True 否则返回 False
>检查左边值是否大于右边值,如果是返回 True 否则返回 False
>=检查左边值是否大于等于右边值,如果是返回 True 否则返回 False
<检查左边值是否小于右边值,如果是返回 True 否则返回 False
<=检查左边值是否小于等于右边值,如果是返回 True 否则返回 False
  • 关系运算的结果都是bool型,要么是true,要么是false
  • 关系表达式经常用在if结构的条件中或循环结构的条件中

逻辑运算符

运算符描述
&&如果两边的操作数都是 True,则为 True,否则为 False
||如果两边的操作数有一个 True,则为 True,否则为 False
!如果条件为 True,则为 False,否则为 True
  • 演示[短路与]、[短路或]
package main

import "fmt"

func abc() bool {
	fmt.Println("abc")
	return true
}

func main() {
	var a = 10
	if a < 9 && abc() {
		// a < 9值为false,所以不执行函数abc(),最后什么都不输出
		fmt.Println("测试")
	}
}

package main

import "fmt"

func abc() bool {
	fmt.Println("abc")
	return true
}

func main() {
	var a = 10
	if a > 9 || abc() {
		// a > 9值为true,所以不执行函数abc(),最后只输出"测试"
		fmt.Println("测试")
	}
}

位运算符

运算符描述
&参与运算的两数各对应的二进位相与(两位均为1才为1)
|参与运算的两数各对应的二进位相或(两位有一个为1就为1)
^参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1(两位不一样则为1)
<<左移n位就是乘以2的n次方(“a<<b”是把a的各二进位全部左移b位,高位丢弃,低位补0)
>>右移n位就是除以2的n次方(“a>>b”是把a的各二进位全部右移b位)
  • 位运算对整数在内存中的二进制位进行操作
  • 对于有符号数而言:
    • 二进制的最高位表示符号位,0表示正数,1表示负数
    • 正数的原码、反码、补码相同
    • 负数的反码取值:它的原码符号位不变,其它位取反
    • 负数的补码取值:它的反码加1
    • 0的反码、补码都是0
  • 最重要的一点:计算机都是以补码进行运算的,输出语句都是以原码输出的
  • Windows系统的计算器程序员模式显示的二进制都是以补码显示的
package main

import "fmt"

func main() {
	var a int8 = -2
	var b int8 = 3
	fmt.Println(a ^ b) // -3
}

/*
-2是有符号数,所以二进制最高位为1,表示负数;反码是原码符号位不变,其它位取反;补码=反码+1
3是有符号数,所以二进制最高位为0,表示正数;正数的原码、反码、补码相同

-2的原码:1000 0010	3的原码:0000 0011
-2的反码:1111 1101	3的反码:0000 0011
-2的补码:1111 1110	3的补码:0000 0011

-2的补码:	1111 1110
3的补码:	0000 0011
-2^3的补码:	1111 1101		// 补码与补码运算后还是补码
-2^3的反码:	1111 1100		// 反码=补码-1
-2^3的原码:	1000 0011 => -3	// 原码=反码符号位不变,其它位取反
*/

  • 右移运算符>>:低位溢出,符号位不变,并用符号位补高位
package main

import "fmt"

func main() {
	var a int8
	a = -103
	fmt.Println(a >> 3) // -13
}

/*
-103的原码:1110 0111
-103的反码:1001 1000
-103的补码:1001 1001

补码右移三位(符号位补高位): 	111 10011
反码=补码-1:					111 10010
原码=反码符号位不变,其它位取反:	100 01101 => -13
*/

  • 左移运算符<<:高位溢出,符号位不变,低位补0

赋值运算符

运算符描述
=将一个表达式的值赋给一个左值
+=相加后再赋值
-=相减后再赋值
*=相乘后再赋值
/=相除后再赋值
%=求余后再赋值
<<=左移后赋值
>>=右移后赋值
&=按位与后赋值
|=按位或后赋值
^=按位异或后赋值
  • 面试题:有两个int型变量ab,要求不能使用中间变量,交换它们的值
package main

import "fmt"

func main() {
	var a = 8
	var b = 2
	fmt.Printf("交换前:a=%v,b=%v\n", a, b)
	a = a + b // 执行后a的值为它们的和
	b = a - b // 执行后b的值为之前a的值
	a = a - b // 执行后a的值为之前b的值
	fmt.Printf("交换后:a=%v,b=%v\n", a, b)
}

/*结果:
交换前:a=8,b=2
交换后:a=2,b=8
*/

其它运算符

运算符描述
&返回变量的地址
*指向变量的指针

运算符优先级和结合性一览表

Go语言运算符优先级和结合性一览表

  • 注意:优先级值越大,表示优先级越高
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值