目录
1. 运算符介绍
运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等。
-
算数运算符;
-
赋值运算符;
-
比较运算符/关系运算符;
-
逻辑运算符;
-
位运算符;
-
其他运算符;
2. 算数运算符
2.1 算数运算符介绍
算数运算符是对数值类型的变量进行运算的,比如:加减乘除。
2.2 算数运算符一览
下表列出了所有Go语言的算术运算符。假定 A 值为 10,B 值为 20。
2.3 算数运算符案例
- 除法运算符案例;
fmt.Println("10 / 4 =", 10/4)
// 打印结果:10 / 4 = 2
// 运算符都是整数,运算除法会去掉小数部分,保留整数部分。
// 如果希望保留小数,则需要有浮点数参与运算。
fmt.Println("10.0 / 4 =", 10.0/4)
// 打印结果:10.0 / 4 = 2.5
- 取模运算符案例;
// Golang取模公式: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)
// 打印结果:
// 10 % 3 = 1
// -10 % 3 = -1
// 10 % -3 = 1
// -10 % -3 = -1
- 自增自减运算符案例;
var i int = 10
i++ // 等价 i = i + 1
fmt.Println("i = ", i)
i-- // 等价 i = i - 1
fmt.Println("i = ", i)
// 打印结果:
// i = 11
// i = 10
2.4 算数运算符细节说明
-
对于除号
/
,它的整数除和小数除是有区别:整数之间做除法时,只保留整数部分而舍弃小数部分; -
当对一个数取模时,可以等价
a % b = a - a / b * b
,可以看到一个取模的本质运算公式; -
Golang的自增自减只能当做一个独立语言使用,不能这样使用:
b := a++
或b := a--
; -
Golang的
++
和--
只能写在变量的后面,不能写在变量的后面,错误案例:++a
或--a
-
Golang的设计者去掉C和Java中的自增自减的容易混淆的写法,让Golang格式更加简洁统一,强制性;
3. 关系运算符
3.1 关系运算符介绍
关系运算符结果都是布尔类型,也就是要是么True
,要么是False
。关系表达式经常用在if结构的条件中或循环结构的条件中。
3.2 关系运算符一览
下表列出了所有Go语言的算术运算符。假定 A 值为 10,B 值为 20。
3.3 关系运算符案例
var a int = 9
var b int = 10
fmt.Println(a == b) // False
fmt.Println(a != b) // True
fmt.Println(a > b) // False
fmt.Println(a >= b) // True
fmt.Println(a < b) // True
fmt.Println(a <= b) // True
3.4 关系运算符细节说明
-
关系运算符的结果都是布尔类型,要么
True
,要么False
; -
关系运算符组成的表达式,我们称为关系表达式;
-
比较运算符
==
不能写为=
;
4. 逻辑运算符
4.1 逻辑运算符介绍
用于连接多个条件(一般来说是关系表达式),最终结果也是一个布尔值。
4.2 逻辑运算符一览
下表列出了所有Go语言的逻辑运算符。假定 A 值为 True,B 值为 False。
4.3 逻辑运算符案例
- 逻辑与运算符使用案例;
var age int = 40
if age > 30 && age < 50 {
fmt.Println("OK1")
}
if age > 30 && age < 40 {
fmt.Println("OK2")
}
// 打印结果:OK1
- 逻辑或运算符使用案例;
var age int = 40
if age > 30 || age < 50 {
fmt.Println("OK1")
}
if age > 30 || age < 40 {
fmt.Println("OK2")
}
// 打印结果:
// OK1
// OK2
- 逻辑非运算符使用案例;
var age int = 40
if age > 30 {
fmt.Println("OK1")
}
if !(age > 30) {
fmt.Println("OK2")
}
// 打印结果:OK1
4.4 逻辑运算符细节说明
-
&&
也叫短路与:如果第一个条件为False
,则第二个条件不会判断,最终结果为False
; -
||
也叫短路或:如果第一个条件为True
,则第二条件不会判断,最终结果为True
;
5. 赋值运算符
5.1 赋值运算符介绍
赋值运算符就是将某个运算后的值,赋给指定的变量。
5.2 赋值运算符一览
5.3 赋值运算符案例
- 简单赋值运算符使用案例;
// 有两个变量a和b,将其进行数据交换。
var a int = 9
var b int = 3
fmt.Printf("转换前的情况: a=%v, b=%v\n", a, b)
var c int = a
a = b
b = c
fmt.Printf("转换后的情况: a=%v, b=%v\n", a, b)
// 打印结果:
// 转换前的情况: a=9, b=3
// 转换后的情况: a=3, b=9
- 相加后再赋值运算使用案例;
var a int = 10
a += 8
fmt.Println(a)
// 打印结果:18
5.4 赋值运算符细节说明
-
运算顺序从右往左;
-
赋值运算符的左边只能是变量,右边可以是变量、表达式、常量值;
-
复合赋值运算符等价于:
a += 3
等于a = a + 3
;
6. 运算符优先级
有些运算符拥有较高的优先级,二元运算符的运算方向均是从左至右。下表列出了所有运算符以及它们的优先级,由上至下代表优先级由高到低:
6.1 运算符优先级案例
当然,你可以通过使用括号来临时提升某个表达式的整体运算优先级。
以上实例运行结果:
package main
import "fmt"
func main() {
var a int = 20
var b int = 10
var c int = 15
var d int = 5
var e int;
e = (a + b) * c / d; // ( 30 * 15 ) / 5
fmt.Printf("(a + b) * c / d 的值为 : %d\n", e );
e = ((a + b) * c) / d; // (30 * 15 ) / 5
fmt.Printf("((a + b) * c) / d 的值为 : %d\n" , e );
e = (a + b) * (c / d); // (30) * (15/5)
fmt.Printf("(a + b) * (c / d) 的值为 : %d\n", e );
e = a + (b * c) / d; // 20 + (150/5)
fmt.Printf("a + (b * c) / d 的值为 : %d\n" , e );
}
// 打印结果:
// (a + b) * c / d 的值为 : 90
// ((a + b) * c) / d 的值为 : 90
// (a + b) * (c / d) 的值为 : 90
// a + (b * c) / d 的值为 : 50
7. 其他运算符
下表列出了Go语言的其他运算符。
7.1 其他运算符案例
var a int = 100
fmt.Println("a 的地址=", &a)
var ptr *int = &a
fmt.Println("ptr 的值=", *ptr)
// 打印结果:
// a 的地址= 0x1400011c008
// ptr 的值= 100
8. 键盘输入
8.1 键盘输入介绍
在编程中,需要接收用户输入的数据,可以使用键盘输入语句来获取。
8.2 键盘输入案例
- 使用
fmt.Scnln()
获取;
var name string
var age byte
var salary float32
var isPass bool
fmt.Println("请输入姓名:")
fmt.Scanln(&name)
fmt.Println("请输入年龄:")
fmt.Scanln(&age)
fmt.Println("请输入薪水:")
fmt.Scanln(&salary)
fmt.Println("是否转正:")
fmt.Scanln(&isPass)
fmt.Printf("姓名:%v\n年龄: %v\n薪水: %v\n是否转正: %v\n", name, age, salary, isPass)
- 使用
fmt.Scaf()
获取;
var name string
var age byte
var salary float32
var isPass bool
fmt.Println("请输入姓名、年龄、薪水、是否转正:")
fmt.Scanf("%s %d %f %t", &name, &age, &salary, &isPass)
fmt.Printf("姓名:%v\n年龄: %v\n薪水: %v\n是否转正: %v\n", name, age, salary, isPass)
9. 进制
9.1 进制介绍
对于整数,有四种表达方式:
-
二进制:0-1,满2进1;
- 在Golang中,不能直接使用二进制来表示一个整数,它沿用了C的特点;
-
八进制:0-7,满8进1,以数字0开头表示;
-
十进制:0-9,满10进1;
-
十六进制:0-9及A-F,满16进1,以0x或0X开头表示(A-F不区分大小写);
9.2 进制案例
// 二进制输出
var num1 = 10
fmt.Printf("num1= %b\n", num1)
// 八进制:0-7,满8进1,以数字0开头表示
var num2 = 011
fmt.Println("num2=", num2)
// 十六进制:0-9及A-F,满16进1,以0x或0X开头表示
var num3 = 0x11
fmt.Println("num3=", num3)
9.3 进制转换
9.3.1 其他进制转换十进制
9.3.1.1 二进制转十进制
规则:从最低位开始(右边的),将每个位上的数提取出来,乘以2的(位数-1)次方,然后求和。
案例:将二进制1011转成十进制的数
1011 = 1 * 1 + 1 * 2 + 0 * 2 * 2 + 1 * 2 * 2 * 2 = 1 + 2 + 0 + 8 = 11
9.3.1.2 八进制转十进制
规则:从最低位开始(右边的),将每个位上的数提取出来,乘以8的(位数-1)次方,然后求和。
案例:将八进制0123转成十进制的数
0123 = 3 * 1 + 2 * 8 + 1 * 8 * 8 = 3 + 16 + 64 = 83
9.3.1.3 十六进制转十进制
规则:从最低位开始(右边的),将每个位上的数提取出来,乘以16的(位数-1)次方,然后求和。
案例:将十六进制0x34A转成十进制的数
0x34A = 10 * 1 + 4 * 16 + 3 * 16 * 16 = 10 + 64 + 768 = 842
9.3.2 十进制转换其他进制
9.3.2.1 十进制转二进制
规则:将该数不断除以2,直到商为0为止,然后将每步得到的余数倒过来,就是对应的二进制。
案例:将十进制56转成二进制
56 = 111000
56 / 2 = 28 === 余 0
28 / 2 = 14 === 余 0
14 / 2 = 7 === 余 0
7 / 2 = 3 === 余 1
3 / 2 = 1 === 余 1
1 === 余 1
9.3.2.2 十进制转八进制
规则:将该数不断除以8,直到商为0为止,然后将每步得到的余数倒过来,就是对应的二进制。
案例:将十进制156转成八进制
156 = 0234
156 / 8 = 19 === 余 4
19 / 8 = 2 === 余 3
2 === 余2
9.3.2.3 十进制转十六进制
规则:将该数不断除以16,直到商为0为止,然后将每步得到的余数倒过来,就是对应的二进制。
案例:将十进制356转成十六进制
356 = 0x164
356 / 16 = 22 === 余 4
22 / 16 = 1 === 余 6
1 === 余 1
9.3.3 二进制转换其他进制
9.3.3.1 二进制转八进制
规则:将二进制数每三位一组(从低位开始组合),转成对应的八进制数即可。
案例:将二进制11010101转成八进制
11010101 = 0325
9.3.3.2 二进制转十六进制
规则:将二进制数每四位一组(从低位开始组合),转成对应的十六进制数即可。
案例:将二进制11010101转成十六进制
11010101 = 0xD5
9.3.4 其他进制转换二进制
9.3.4.1 八进制转二进制
规则:将八进制数每1位,转成对应的一个3位的二进制数即可。
案例:将八进制0237转成二进制
0237 = 10011111
9.3.4.2 十六进制转二进制
规则:将十六进制数每1位,转成对应的一个四位的二进制数即可。
案例:将十六进制0x237转成二进制
0x237 = 1000110111
10. 位运算
10.1 位运算介绍
位运算符对整数在内存中的二进制位进行操作。
下表列出了位运算符 &, |, 和 ^ 的计算:
假定 A = 60; B = 13; 其二进制数转换为:
A = 0011 1100
B = 0000 1101
-----------------
A&B = 0000 1100
A|B = 0011 1101
A^B = 0011 0001
10.2 位运算一览
Go 语言支持的位运算符如下表所示。假定 A 为60,B 为13
10.3 原码、反码、补码
对于有符号的数而言:
-
二进制的最高位是符号位,0表示正数,表示负数;
-
正数的原码、反码和补码都一样;
-
负数的反码 = 它的原码符号位不变,其他位取反(0->1,1->0);
-
负数的补码 = 它的反码+1;
-
0的反码和补码都是0;
-
在计算机运算的时候,都是以补码的方式来运算的;
10.3 位运算案例
var a uint = 60 /* 60 = 0011 1100 */
var b uint = 13 /* 13 = 0000 1101 */
var c uint = 0
c = a & b /* 12 = 0000 1100 */
fmt.Printf("第一行 - c 的值为 %d\n", c )
c = a | b /* 61 = 0011 1101 */
fmt.Printf("第二行 - c 的值为 %d\n", c )
c = a ^ b /* 49 = 0011 0001 */
fmt.Printf("第三行 - c 的值为 %d\n", c )
c = a << 2 /* 240 = 1111 0000 */
fmt.Printf("第四行 - c 的值为 %d\n", c )
c = a >> 2 /* 15 = 0000 1111 */
fmt.Printf("第五行 - c 的值为 %d\n", c )
// 打印结果:
// 第一行 - c 的值为 12
// 第二行 - c 的值为 61
// 第三行 - c 的值为 49
// 第四行 - c 的值为 240
// 第五行 - c 的值为 15
标签:Golang,二进制,fmt,编程,运算符,var,Println,9.3
From: https://www.cnblogs.com/aadam/p/17032932.html