首页 > 编程语言 >Golang入门到实战核心编程-第四章-运算符

Golang入门到实战核心编程-第四章-运算符

时间:2023-01-07 16:34:10浏览次数:39  
标签:Golang 二进制 fmt 编程 运算符 var Println 9.3

目录

1. 运算符介绍

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

  • 算数运算符;

  • 赋值运算符;

  • 比较运算符/关系运算符;

  • 逻辑运算符;

  • 位运算符;

  • 其他运算符;

2. 算数运算符

2.1 算数运算符介绍

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

2.2 算数运算符一览

下表列出了所有Go语言的算术运算符。假定 A 值为 10,B 值为 20。

2.3 算数运算符案例

  1. 除法运算符案例;
fmt.Println("10 / 4 =", 10/4)
// 打印结果:10 / 4 = 2
// 运算符都是整数,运算除法会去掉小数部分,保留整数部分。

// 如果希望保留小数,则需要有浮点数参与运算。
fmt.Println("10.0 / 4 =", 10.0/4)
// 打印结果:10.0 / 4 = 2.5
  1. 取模运算符案例;
// 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
  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 算数运算符细节说明

  1. 对于除号/,它的整数除和小数除是有区别:整数之间做除法时,只保留整数部分而舍弃小数部分;

  2. 当对一个数取模时,可以等价a % b = a - a / b * b ,可以看到一个取模的本质运算公式;

  3. Golang的自增自减只能当做一个独立语言使用,不能这样使用:b := a++b := a--

  4. Golang的++--只能写在变量的后面,不能写在变量的后面,错误案例:++a--a

  5. 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 关系运算符细节说明

  1. 关系运算符的结果都是布尔类型,要么True,要么False

  2. 关系运算符组成的表达式,我们称为关系表达式

  3. 比较运算符==不能写为=

4. 逻辑运算符

4.1 逻辑运算符介绍

用于连接多个条件(一般来说是关系表达式),最终结果也是一个布尔值。

4.2 逻辑运算符一览

下表列出了所有Go语言的逻辑运算符。假定 A 值为 True,B 值为 False。

4.3 逻辑运算符案例

  1. 逻辑与运算符使用案例;
var age int = 40
if age > 30 && age < 50 {
	fmt.Println("OK1")
}

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

// 打印结果:OK1
  1. 逻辑或运算符使用案例;
var age int = 40
if age > 30 || age < 50 {
	fmt.Println("OK1")
}

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

// 打印结果:
// OK1
// OK2
  1. 逻辑非运算符使用案例;
var age int = 40
if age > 30 {
	fmt.Println("OK1")
}

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

// 打印结果:OK1

4.4 逻辑运算符细节说明

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

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

5. 赋值运算符

5.1 赋值运算符介绍

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

5.2 赋值运算符一览

5.3 赋值运算符案例

  1. 简单赋值运算符使用案例;
// 有两个变量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
  1. 相加后再赋值运算使用案例;
var a int = 10
a += 8
fmt.Println(a)

// 打印结果:18

5.4 赋值运算符细节说明

  1. 运算顺序从右往左;

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

  3. 复合赋值运算符等价于: 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 键盘输入案例

  1. 使用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)
  1. 使用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 进制介绍

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

  1. 二进制:0-1,满2进1;

    • 在Golang中,不能直接使用二进制来表示一个整数,它沿用了C的特点;
  2. 八进制:0-7,满8进1,以数字0开头表示;

  3. 十进制:0-9,满10进1;

  4. 十六进制: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 原码、反码、补码

对于有符号的数而言:

  1. 二进制的最高位是符号位,0表示正数,表示负数;

  2. 正数的原码、反码和补码都一样;

  3. 负数的反码 = 它的原码符号位不变,其他位取反(0->1,1->0);

  4. 负数的补码 = 它的反码+1;

  5. 0的反码和补码都是0;

  6. 在计算机运算的时候,都是以补码的方式来运算的;

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

相关文章

  • Golang入门到实战核心编程-第三章-变量
    目录1.Golang数据类型分类2.数据类型的默认值3.数据类型及大小3.1查看变量的数据类型3.2查看变量占用字节大小4.数据类型介绍4.1整数类型4.1.1整型各个类型对比4.1......
  • 客服系统即时通讯IM开发(二)Golang + Gin框架实现服务端WebScoket【唯一客服】网站在线
    我的客服系统使用的Golang+Gin作为后端服务,所以下面的代码是演示demo在Go语言中使用Gin框架实现WebSocket的方法如下:安装gin-gonic/websocket库。在Gin......
  • C++ - TCP/UDP网络编程
    前言socket编程分为TCP和UDP两个模块,其中TCP是可靠的、安全的,常用于发送文件等,而UDP是不可靠的、不安全的,常用作视频通话等。如下图:头文件与库:#include<WinSock2.h>......
  • 2023年01月编程语言流行度排名
    点击查看最新编程语言流行度排名(每月更新)2023年01月编程语言流行度排名编程语言流行度排名是通过分析在谷歌上搜索语言教程的频率而创建的一门语言教程被搜索的次数越多......
  • 003.函数式编程(函数式接口Predicate)
    1.函数式接口Predicate  2.代码示例packagecom.imooc.lambda;importjava.util.Arrays;importjava.util.List;importjava.util.function.Predicate;/**......
  • Jody在编程
    如果说编程语言是一种人与机器的交流,那么普通的文字,话语就是心灵的交汇。虽然关于交流沟通的书我没有看过几本,但是基础的逻辑还是了解的。之所以这样开篇,是因为基于文字......
  • python网络编程
    网络编程1软件开发架构、网络编程简介、OSI七层协议以及网络相关设施2TCP/IP协议、Socket套接字以及黏包问题的解决方案3UDP协议、多道技术、进程理论以及同步异步、......
  • C#运算符和值类型扫盲
    记录一些方便回顾的知识点。算术运算符加减乘除,取模%,自增自减。注意i++和++i在赋值时的区别,与C语言相同。a=z++;会先将z的值赋给a再自加1的运算。a=++z;会......
  • Golang的变量声明
    变量使用步骤声明赋值引用packagemainimport"fmt"funcmain(){ //1.变量的声明 varzlint //2.变量的赋值 zl=19 //3.变量的使用 fmt.Println(......
  • 关系运算符、逻辑运算符——the thirteenth——2023.1.5
    关系运算符  在C语言中=是赋值的意思,而==才是等于的意思  逻辑运算符一共有三种:&&(并且)、||(或者)、!(非)年龄:取值16-50岁。身高:取值150cm-190cm。身材:1-火辣;2-......