11、运算符介绍

1)算术运算符±*/ %(取余数)

  • 取模的实际计算公式:a % b = a - a / b * b
  • 整数除法会去掉小数点部分
  • 自增自减只能当作独立语句使用,不能 a := b++
  • ++ --只能写在变量后面,不能写在变量前面

2)赋值运算符= += -= *= /= %=

赋值运算符是将某个运算后的值,赋给指定的变量 特点: 1)运算顺序是从右向左,先运算等号右侧内容 2)赋值运算符的左边只能是变量,右边 可以是变量、表达式、常量值 3)a += b 等价 a = a + b

3)关系运算符(比较运算符)== != >= <= > <

结果都是bool型 一般用在if或者for循环结构中

package main

import "fmt"

func main() {
	//假如还有97天放假,问等于多少星期多少天
	var days int = 97
	var week = days / 7
	var day = days % 7
	fmt.Printf("总共%d天,等于%d星期零%d天 \n", days, week, day)
	//定义一个变量保存华氏温度,华氏温度转摄氏温度公式为5/9*(华氏温度-100),求摄氏温度
	var hs float32 = 134.2
	var ss = 5.0 / 9 * (hs - 100)
	fmt.Printf("华氏温度是%v,摄氏温度是%v", hs, ss)
}

4)逻辑运算符 && || ! 与或非

  • 用于连接多个条件,最终的结果是一个bool值
  • &&也叫短路与,第一个条件为false,后续条件不再判断
  • ||也叫短路或,第一个条件为true,后续条件不再判断
package main

import "fmt"

func main() {
	var age int = 40
	//逻辑与,需要所有条件都true,结果才是true,否则flase
	if age > 30 && age < 50 {
		fmt.Println("ok1")
	}
	if age > 30 && age < 40 {
		fmt.Println("ok2")
	}
	//逻辑或,有一个条件true,结果就是true
	if age > 30 || age < 50 {
		fmt.Println("ok3")
	}
	//逻辑非,取反
	if !(age > 30 || age < 40) {
		fmt.Println("ok4")
	}
}

5)位运算符&与 |或 ^异或 << >>

原码、反码、补码

1)对于有符号类型:二进制数最高位是符号位,0是正数、1是负数 1==>[0000 0001] -1==>[1000 0001]
2)正数的原码、反码、补码都一样 1 ==> 原码 [0000 0001] 反码 [0000 0001] 补码[0000 0001]
3)负数的反码=原码符号位不变,其他位取反 负数的补码=反码+1 -1 ==> 原码 [1000 0001] 反码 [1111 1110] 补码[1111 1111]
4)在计算机运行时,都是以补码的方式来运算的 5)0的反码补码都是0 2&3 0000 0010 按位"与"的规则 全部为1, 结果为1,否则0 0000 0011 0000 0010 ==> 2 2|3 0000 0010 按位或的规则
有一个为1, 结果为1 否则0 0000 0011 0000 0011 ==> 3 2^3 0000 0010 按位异或的规则 有一个为0一个为1,结果为1 否则0 0000 0011 0000 0001 ==> 1 -2^2
-2的原码1000 0010 反码 1111 1101 补码 1111 1110 2的补码等于原码 0000 0010 1111 1100 ==> 这是个补码 反码为 1111 1011 原码为 1000 0100 ==> -4

golang中的2个移位运算符

>>右移运算符:低位溢出,符号位不变,并用符号位补溢出的高位
a := 1>>2 // 0000 0001 ==> 0000 0000 = 0
<<左移运算符:符号位不变,低位补0
b := 1<<2 // 0000 0001 ==> 0000 0100 = 4
package main

import "fmt"

func main() {
	fmt.Println(2 & 3)  // 2
	fmt.Println(2 | 3)  // 3
	fmt.Println(2 ^ 3)  // 1
	fmt.Println(-2 ^ 2) // -4
	fmt.Println(1 >> 2) // 0000 0001 ==> 0000 0000 = 0
	fmt.Println(1 << 2) // 0000 0001 ==> 0000 0100 = 4
}

6)其他运算符 & 指针变量存储地址,* 标识指针变量

运算符优先顺序

1)括号 ++ – 2)单目运算符 从右向左 3)算数运算符 4)移位运算符 5)关系运算符 6)位运算符 7)逻辑运算符 8)赋值运算符 从右向左 9)逗号

  • 进制:go中不能直接使用二进制,可以直接使用八进制011、十六进制0x11
  • 相互转换规则:
  • 其他进制转十进制:从最低为开始,将每个位上的数乘以对应进制的 位数-1 次方
  • 十进制转二进制:将该数不断除以2,直到商为0,然后将每步的余数倒过来
  • 十进制转八进制:将该数不断除以8,直到商为0,然后将每步的余数倒过来
  • 十进制转十六进制:将该数不断除以16,直到商为0,然后将每步的余数倒过来
  • 二进制转八进制:将二进制数从低位开始,每3位一组,转成对应的八进制即可
  • 二进制转十六进制:将二进制数从低位开始,每4位一组,转成对应的十六进制即可
  • 八进制转二进制:将八进制数的每一位,转成对应的3位二进制数即可
  • 十六进制转二进制:将十六进制数的每一位,转成对应的4位二进制数即可

获取用户终端输入

单个获取fmt.Scanln(&isPass) 格式化批量获取fmt.Scanf("%s %d %f %t", &name, &age, &sal, &isPass)

package main

import "fmt"

func main() {
	var age byte
	fmt.Println("请输入年龄:")
	fmt.Scanln(&age)
	if age > 18 {
		fmt.Println("18岁,啵啵脆!")
	} else if age > 50 {
		fmt.Println("50岁那年不要脸,参加了挑战")
	} else {
		fmt.Println("17岁那年不要脸,参加了挑战")
	}

	var year int
	fmt.Scanln(&year)
	if (year%4 == 0 && year%100 != 0) || year%400 == 0 {
		fmt.Printf("%d年是闰年", year)
	} else {
		fmt.Printf("%d年不是闰年\n", year)
	}

	var b bool = true
	if b = false; b {
		fmt.Println("ok1")
	} else {
		fmt.Println("ok2")
	}
}