Golang -> 运算符

198 阅读8分钟

运算符

运算符的基本介绍

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

● 算术运算符 

●  赋值运算符 

● 比较运算符/关系运算符 

● 逻辑运算符 

● 位运算符 

● 其它运算符

算术运算符

算术运算符是对数值类型的变量进行运算的,比如:加减乘除。在 Go 程序中使用的非常多

算术运算符的一览表

/ 的使用的特点

	//重点讲解 /、%
	//说明,如果运算的数都是整数,那么除后,去掉小数部分,保留整数部分
	fmt.Println(10 / 4var n1 float32 = 10 / 4 
	fmt.Println(n1)

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

% 的使用特点

	// 演示  % 的使用
	// 看一个公式 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)

++ 和 --的使用

	// ++ 和 --的使用
	var i int = 10
	i++                  // 等价 i = i + 1
	fmt.Println("i=", i) // 11
	i--                  // 等价 i = i - 1
	fmt.Println("i=", i) // 10

	if i > 0 {
		fmt.Println("ok")
	}

算术运算符使用的注意事项

● 对于除号 "/",它的整数除和小数除是有区别的:

● 整数之间做除法时,只保留整数部分而舍弃 小数部分。 

○ 例如: x := 19/5 ,结果是 3 

● 当对一个数取模时,可以等价 a%b=a-a/b*b , 这样我们可以看到 取模的一个本质运算。 

● Golang 的自增自减只能当做一个独立语言使用时,不能这样使用

● Golang 的++ 和 -- 只能写在变量的后面,不能写在变量的前面

● 即:

○ 只有 a++, a-- 

○ 没有 ++a, --a 

● Golang 的设计者去掉 c / java 中的 自增自减的容易混淆的写法,让 Golang 更加简洁,统一。(强制性的)

关系运算符(比较运算符)

● 关系运算符的结果都是 bool 型,也就是要么是 true,要么是 false 

● 关系表达式 经常用在 if 结构的条件中或循环结构的条件中

关系运算符一览图

image.png

	//演示关系运算符的使用
	var n1 int = 9
	var n2 int = 8
	fmt.Println(n1 == n2) //false
	fmt.Println(n1 != n2) //true
	fmt.Println(n1 > n2) //true
	fmt.Println(n1 >= n2) //true
	fmt.Println(n1 < n2) //flase
	fmt.Println(n1 <= n2) //flase
	flag := n1 > n2
	fmt.Println("flag=", flag)

关系运算符的细节说明

● 关系运算符的结果都是 bool 型,也就是要么是 true,要么是 false。 

● 关系运算符组成的表达式,我们称为关系表达式: a > b 

● 比较运算符"=="不能误写成 "=" 

逻辑运算符

用于连接多个条件(一般来讲就是关系表达式),最终的结果也是一个 bool 值

逻辑运算的说明

image.png

	//演示逻辑运算符的使用  &&
	var age int = 40
	if age > 30 && age < 50 {
		fmt.Println("ok1")
	}

	if age > 30 && age < 40 {
		fmt.Println("ok2")
	}

	//演示逻辑运算符的使用  ||

	if age > 30 || age < 50 {
		fmt.Println("ok3")
	}

	if age > 30 || age < 40 {
		fmt.Println("ok4")
	}

	//演示逻辑运算符的使用  !

	if age > 30 {
		fmt.Println("ok5")
	}

	if !(age > 30) {
		fmt.Println("ok6")
	}

注意事项和细节说明

● &&也叫短路与:如果第一个条件为 false,则第二个条件不会判断,最终结果为 false 

● ||也叫短路或:如果第一个条件为 true,则第二个条件不会判断,最终结果为 true

	var i int = 10
	//短路与说明 因为  i < 9 为 false ,因此后面的 test() 就不执行
	if i < 9 && test() {
		fmt.Println("ok...")
	}

	if i > 9 || test() {
		fmt.Println("hello...")
	}

赋值运算符

赋值运算符就是将某个运算后的值,赋给指定的变量。

赋值运算符的分类

	//赋值运算符的使用演示
	var i int
	i = 10 //基本赋值
	fmt.Println(i)

	//有两个变量,a和b,要求将其进行交换,最终打印结果
	// a = 9 , b = 2 ==> a = 2 b = 9
	a := 9
	b := 2
	fmt.Printf("交换前的情况是 a = %v , b=%v \n", a, b)
	//定义一个临时变量
	t := a
	a = b //
	b = t //
	fmt.Printf("交换后的情况是 a = %v , b=%v \n", a, b)

	//复合赋值的操作
	a += 17 // 等价 a = a + 17
	fmt.Println("a=", a)

赋值运算符的特点

● 运算顺序从右往左

	var c int
	c = a + 3 // 赋值运算的执行顺序是从右向左
	fmt.Println(c)

● 赋值运算符的左边 只能是变量,右边 可以是变量、表达式、常量值

	///赋值运算符的左边 只能是变量,右边 可以是变量、表达式、常量值
	// 表达式:任何有值都可以看做表达式
	var d int
	d = a           //
	d = 8 + 2*8     // =的右边是表达式
	d = test() + 90 //  =的右边是表达式
	//d = 890 // 890常量
	fmt.Println(d)

● 复合赋值运算符等价于下面的效果

○ 比如:a += 3 等价于 a = a + 3

位运算符

其它运算符说明

	//演示一把 & 和 *的使用

	a := 100
	fmt.Println("a 的地址=", &a)

	var ptr *int = &a
	fmt.Println("ptr 指向的值是=", *ptr)

特别说明

image.png

	var n int 
	var i int = 10
	var j int = 12
	//传统的三元运算
	//n = i > j ? i : j
	if i > j {
		n = i
	} else {
		n = j
	}
	fmt.Println("n=", n) // 12

运算符的优先级

对上图的说明

● 运算符有不同的优先级,所谓优先级就是表达式运算中的运算顺序。

● 如表,上一行运算符优先于下一行。 

● 只有单目运算符、赋值运算符是从右向左运算的。

● 梳理了一个大概的优先级 

1:括号,++, -- 

2: 单目运算 

3:算术运算符 

4:移位运算 

5:关系运算符 

6:位运算符 

7:逻辑运算符 

8:赋值运算符 

9:逗号

键盘输入语句

在编程中,需要接收用户输入的数据,就可以使用键盘输入语句来获取。InputDemo.go

● 导入 fmt 包 

● 调用 fmt 包的 fmt.Scanln() 或者 fmt.Scanf()

image.png

● 使用 fmt.Scanln() 获取

	//要求:可以从控制台接收用户信息,【姓名,年龄,薪水, 是否通过考试 】。
	//方式1 fmt.Scanln
	//1先声明需要的变量
	var name string
	var age byte
	var sal float32
	var isPass bool

	//当程序执行到 fmt.Scanln(&name),程序会停止在这里,等待用户输入,并回车
	fmt.Println("请输入姓名 ")
	fmt.Scanln(&name)
	
	fmt.Println("请输入年龄 ")
	fmt.Scanln(&age)
	
	fmt.Println("请输入薪水 ")
	fmt.Scanln(&sal)

	fmt.Println("请输入是否通过考试 ")
	fmt.Scanln(&isPass)

	fmt.Printf("名字是 %v \n 年龄是 %v \n 薪水是 %v \n 是否通过考试 %v \n", name, age, sal, isPass)

● 使用 fmt.Scanf() 获取

	//方式2:fmt.Scanf,可以按指定的格式输入
	fmt.Println("请输入你的姓名,年龄,薪水, 是否通过考试, 使用空格隔开")
	fmt.Scanf("%s %d %f %t", &name, &age, &sal, &isPass)
	fmt.Printf("名字是 %v \n年龄是 %v \n 薪水是 %v \n 是否通过考试 %v \n", name, age, sal, isPass)

进制

对于整数,有四种表示方式: 

● 二进制:0,1 ,满 2 进 1。 在 golang 中,不能直接使用二进制来表示一个整数,它沿用了 c 的特点。 

● 十进制:0-9 ,满 10 进 1。 

● 八进制:0-7 ,满 8 进 1. 以数字 0 开头表示。 

● 十六进制:0-9 及 A-F,满 16 进 1. 以 0x 或 0X 开头表示。 此处的 A-F 不区分大小写。

	var i int = 5
	//二进制输出 
	fmt.Printf("%b \n", i)

	//八进制:0-7 ,满8进1. 以数字0开头表示
	var j int = 011 // 011=> 9
	fmt.Println("j=", j)

	//0-9及A-F,满16进1. 以0x或0X开头表示
	var k int = 0x11 // 0x11=> 16 + 1 = 17
	fmt.Println("k=", k)

进制的图示

进制转换的介绍

其它进制转十进制

二进制如何转十进制

● 多少进制就用各自的位置数字 * 进制的x次方(x从0开始) = 十进制

image.png

八进制转换成十进制示例

● 多少进制就用各自的位置数字 * 进制的x次方(x从0开始) = 十进制

16 进制转成 10 进制

● 多少进制就用各自的位置数字 * 进制的x次方(x从0开始) = 十进制

image.png

十进制如何转成其它进制

image.png

十进制如何转二进制

十进制转成八进制

十进制转十六进制

二进制转换成八进制、十六进制

二进制转换成八进制

image.png

二进制转成十六进制

八进制、十六进制转成二进制

image.png

八进制转换成二进制

image.png

十六进制转成二进制

位运算

二进制在运算中的说明

● 二进制是逢 2 进位的进位制,0、1 是基本算符。 

● 现代的电子计算机技术全部采用的是二进制,因为它只使用 0、1 两个数字符号,非常简单方便易于用电子方式实现。

● 计算机内部处理的信息,都是采用二进制数来表示的。

● 二进制(Binary)数用 0 和 1 两个数字及其组合来表示任何数。

● 进位规则是“逢 2 进 1”,数字 1 在不同的位上代表不同的值, 按从右至左的次序,这个值以二倍递增。 

● 在计算机的内部,运行各种运算时,都是以二进制的方式来运行。

原码、反码、补码

位运算符和移位运算符

按位与&、按位或|、按位异或^,它们的运算规则

● 按位与& : 两位全为1,结果为 1,否则为 0 

● 按位或| : 两位有一个为 1,结果为 1,否则为 0 

● 按位异或 ^ : 两位一个为 0,一个为 1,结果为 1,否则为 0

	//位运算的演示
	fmt.Println(2&3) // 2
	fmt.Println(2|3) // 3
	fmt.Println(2^3) // 3
	fmt.Println(-2^2) //-4

image.png

>>、<< 右移和左移,运算规则

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

左移运算符 <<: 符号位不变,低位补 0

	a := 1 >> 2 // 0000 0001 =>0000 0000 = 0
	c := 1 << 2 // 0000 0001 ==> 0000 0100 => 4
	fmt.Println("a=", a, "c=", c)