【一Go到底】第七天---运算符

131 阅读5分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第7天,点击查看活动详情

一、运算符介绍

运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等

  1. 算术运算符
  2. 赋值运算符
  3. 比较运算符/关系运算符
  4. 逻辑运算符
  5. 位运算符
  6. 其他运算符

二、算术运算符

算术运算符是对数值类型的变量进行运算的,比如:加诚乘除

运算符运算范例结果
+正号+11
-负号-1-1
+1+12
-1-10
*2*24
/2/21
%取模(余)10%50
++自增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 == 2false
!=不等1 != 2true
<小于1 < 2true
>大于1 > 2false
<=小于等于1 <= 2true
>=大于等于1 >= 2false
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 注意事项

  1. &&也叫短路与:如果第一个条件为false,则第二个条件不会判断,最终结果为false
  2. || 也叫短路或: 如果第一个条件为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)
}