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