Go学习第三章——运算符与进制

news/2024/12/21 22:08:31/

Go学习第三章——运算符与进制

      • 1 算术运算符
      • 2 关系运算符
      • 3 逻辑运算符
      • 4 赋值运算符
      • 5 其他运算符
        • 5.1 位运算符
        • 5.2 跟指针有关的运算符
      • 6 运算符的优先级
      • 7 获取用户终端输入
      • 8 进制转换
        • 8.1 进制基本使用
        • 8.2 进制之间的转换
        • 8.3 原码 反码 补码
        • 8.4 位运算符详解

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

在这里插入图片描述

ps:没有三元运算符

1 算术运算符

  1. 算术运算符:+ ,-,*,/,%,++,–
  2. 介绍:算术运算符是对数值类型的变量进行运算的,比如,加减乘除。
  3. 细节说明:
  • 当对一个数取模时,可以等价a%b=a-a/b*b,这样就是取模的本质运算
  • Golang的自增自减只能当作一个独立的语言使用,不能这样使用b := a++或者b := a--
  • Golang的++和–只能写在变量的后面,不能卸载变量的前面,即:只有a++ a--没有++a --a
  • Golang的设计者去掉c/java中的自增自减容易混淆的写法,让Golang更加简洁,统一。

例子演示:

func main() {var i int = 8var a int//a = i++ // 错误//a = i-- // 错误// 下面这个做法也是错的/*if i++ >0 {fmt.Println("ok")}*/i++a = ifmt.Println("a的值:", a)//--i // 错误i--a = ifmt.Println("a的值:", a)
}

输出:

a的值: 9
a的值: 8

课堂练习:

func main() {// 假如还有97天放假,问:xx个星期零xx天var days int = 97var week int = days / 7var day int = days % 7fmt.Printf("%d个星期零%d天\n", week, day)// 定义一个变量保存华氏温度// 华氏温度转换摄氏温度的公式为:5/9*(华氏温度-100),求出华氏温度对应的摄氏温度。var huashi float32 = 134.2var sheshi float32 = 5.0 / 9 * (huashi - 100)fmt.Printf("%v 对应的摄氏温度=%v \n", huashi, sheshi)
}

输出:

13个星期零6134.2 对应的摄氏温度=19

2 关系运算符

  1. 关系运算符:==,!=,>,<,> =,<=
  2. 关系运算符的结果都是bool型,也就是要么是true,要么是false
  3. 关系表达式经常用在流程控制中

例子演示:

func main() {fmt.Println(5 == 9) //判断左右两侧的值是否相等,相等返回true,不相等返回的是false, ==不是=fmt.Println(5 != 9) //判断不等于fmt.Println(5 > 9)fmt.Println(5 < 9)fmt.Println(5 >= 9)fmt.Println(5 <= 9)
}

输出:

false
true
false
true
false
true

3 逻辑运算符

逻辑运算符:&&(逻辑与/短路与),||(逻辑或/短路或),!(逻辑非)

与逻辑&& :两个数值/表达式只要有一侧是false,结果一定为false
也叫短路与:只要第一个数值/表达式的结果是false,那么后面的表达式等就不用运算了,直接结果就是false

或逻辑||:两个数值/表达式只要有一侧是true,结果一定为true
也叫短路或:只要第一个数值/表达式的结果是true,后面的表达式等就不用运算,直接就是true -->提高运算效率

非逻辑!:逻辑非运算符,!true就是false,!false就是true

例子演示:

func main() {var age int = 40fmt.Println("逻辑与(一边为false):", age < 35 && age == 40)fmt.Println("逻辑与(一边为true):", age > 35 && age > 40)fmt.Println("逻辑与(两边为true):", age > 35 && age == 40)fmt.Println("逻辑与(两边为false):", age > 35 && age < 40)fmt.Println()fmt.Println("逻辑或(一边为false):", age < 35 || age == 40)fmt.Println("逻辑或(一边为true):", age > 35 || age < 40)fmt.Println("逻辑或(两边为true):", age > 35 || age == 40)fmt.Println("逻辑或(两边为false):", age > 35 || age < 40)fmt.Println()// 短路,只要第一个数值为true,后面的表达式不用运算,直接就是true// 所以会发现输出的地方,并没有打印testfmt.Println("逻辑或(一边为true):", age > 35 || test())
}

输出:

逻辑与(一边为false)false
逻辑与(一边为true)false
逻辑与(两边为true)true
逻辑与(两边为false)false逻辑或(一边为false)true
逻辑或(一边为true)true
逻辑或(两边为true)true
逻辑或(两边为false)true逻辑或(一边为true)true

4 赋值运算符

  1. 赋值运算符:=,+=,-=,*=,/=,%=
  2. 赋值运算符就是将某个运算后的值,赋给指定的变量。

例子演示:

func main() {var a int = 10var b int = 1fmt.Println("b+=a前,b=", b)b += afmt.Println("b+=a后,b=", b)fmt.Println()fmt.Println("b-=a前,b=", b)b -= afmt.Println("b-=a后,b=", b)fmt.Println()fmt.Println("b*=a前,b=", b)b *= afmt.Println("b*=a后,b=", b)fmt.Println()fmt.Println("b/=a前,b=", b)b /= afmt.Println("b/=a后,b=", b)fmt.Println()fmt.Println("b%=a前,b=", b)b %= afmt.Println("b%=a后,b=", b)
}

输出:

b+=a前,b= 1
b+=a后,b= 11b-=a前,b= 11
b-=a后,b= 1b*=a前,b= 1
b*=a后,b= 10b/=a前,b= 10
b/=a后,b= 1b%=a前,b= 1
b%=a后,b= 1

赋值运算符的特点:

  1. 运算顺序从右往左
  2. 赋值运算符的左边只能是变量,右边可以是变量、表达式、常量值
  3. 复合赋值运算符等价于下面的效果,比如:a+=3 等价于 a=a + 3

5 其他运算符

5.1 位运算符

在这里插入图片描述

5.2 跟指针有关的运算符

& :返回变量的存储地址
*:取指针变量对应的数值

func main() {var age int = 18fmt.Println("age对应的存储空间的地址为:", &age) //age对应的存储空间的地址为: 0xc0000100b0var ptr *int = &agefmt.Println("ptr对应的存储空间的地址为:", ptr)fmt.Println("ptr这个指针指向的具体数值为:", *ptr)
}

输出:

age对应的存储空间的地址为: 0x980a0b8
ptr对应的存储空间的地址为: 0x980a0b8
ptr这个指针指向的具体数值为: 18

6 运算符的优先级

Go语言有几十种运算符,被分成十几个级别,有的运算符优先级不同,有的运算符优先级相同,请看下表。

逗号的优先级是最低,括号(后缀运算符)优先级最高

在这里插入图片描述

为了提高优先级,就加()括号

7 获取用户终端输入

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

有两种方式可以获取到键盘的输入:

**fmt.Scanln(a … interface{}) **在换行的时候停止,也就是获取一行的数据

**fmt.Scanf(format string, a … interface{}) **根据格式,把值传到变量里面

案例演示:

要求:可以从控制台接收用户信息,【姓名,年龄,薪水,是否通过考试】

方式一:使用fmt.Scanln()

func main() {var name stringvar age bytevar sale float32var isPass bool//方式一:使用fmt.Scanln()// 注意:只用使用&name,才会影响到这个name的值fmt.Println("请输入姓名 ")// 当执行程序到这里,程序会停止在这里,等到用户输入,并回车fmt.Scanln(&name)fmt.Println("请输入年龄 ")fmt.Scanln(&age)fmt.Println("请输入薪水 ")fmt.Scanln(&sale)fmt.Println("请输入是否通过考试 ")// 如果你输入是,返回的会是bool类型的默认值,falsefmt.Scanln(&isPass)fmt.Printf("名字是 %v,年龄是 %v,薪水是 %v,是否通过考试 %v 。", name, age, sale, isPass)
}

输出:

请输入姓名
小智
请输入年龄 
18
请输入薪水 
11111
请输入是否通过考试 
true
名字是 小陈,年龄是 18,薪水是 11111,是否通过考试 true

方式二:使用fmt.Scanf()

func main() {var name stringvar age bytevar sale float32var isPass bool//方式二:使用fmt.Scanf(),可以按照指定的格式输入fmt.Println("请输入你的姓名,年龄,薪水,是否通过考试,使用空格隔开")fmt.Scanf("%s %d %f %t", &name, &age, &sale, &isPass)fmt.Printf("名字是 %v,年龄是 %v,薪水是 %v,是否通过考试 %v 。", name, age, sale, isPass)
}

输出:

请输入你的姓名,年龄,薪水,是否通过考试,使用空格隔开
小智 18 11111 true
名字是 小智,年龄是 18,薪水是 11111,是否通过考试 true

8 进制转换

8.1 进制基本使用

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

  1. 二进制:0,1 ,满 2 进 1。
    在 golang 中,不能直接使用二进制来表示一个整数,它沿用了 c 的特点。
  2. 十进制:0-9 ,满 10 进 1。
  3. 八进制:0-7 ,满 8 进 1. 以数字 0 开头表示。
  4. 十六进制:0-9 及 A-F,满 16 进 1. 以 0x 或 0X 开头表示。
    此处的 A-F 不区分大小写。
func main() {var num int = 5// 二进制输出fmt.Printf("num的二进制:%b \n", num)// 八进制var num8 int = 011fmt.Println("八进制011的十进制值:", num8)// 十六进制var num16 int = 0x11fmt.Println("十六进制011的十进制值:", num16)
}

输出:

num的二进制:101
八进制011的十进制值: 9
十六进制011的十进制值: 17
8.2 进制之间的转换

略~~~~这里就不写了,网上大把!!

8.3 原码 反码 补码

略~~~~这里也不写了,网上大把!!

8.4 位运算符详解

& 按位运算符

| 按位运算符

^ 按位异或运算符

在这里插入图片描述

移位运算符

Golang中有2个移位运算符:>>、<< 右移和左移,运算规则:

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

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

案例演示

func main() {a := 10 // 十进制10,二进制1010// 输出 10 << 1 = 20,10的二进制1010向左移1位是10100,即十进制的20fmt.Printf("%d << %d = %d\n", a, 1, a<<1)var b uint8 = 255 // 返回的类型是无符号整型 255的二进制是11111111// 输出 255 >> 1 = 127,11111111向右移动一位变成01111111,十进制为127fmt.Printf("%d >> %d = %d\n", b, 1, b>>1)
}

输出:

10 << 1 = 20
255 >> 1 = 127

第三章结束啦~~~冲冲冲,接着学!!!


http://www.ppmy.cn/news/1170202.html

相关文章

LabVIEW中PID控制的的高级功能

LabVIEW中PID控制的的高级功能 比例-积分-微分&#xff08;PID&#xff09;控制占当今控制和自动化应用的90%以上&#xff0c;主要是因为它是一种有效且简单的解决方案。虽然PID算法最初用于线性、时不变系统&#xff0c;但现在已经发展到控制具有复杂动力学的系统。在现实世界…

springBoot--web--路径匹配

路径匹配 前言在配置文件中配置路径匹配结果 前言 spring5.3之后加入了更多的请求路径匹配的实现策略 以前只支持antPathMatcher策略&#xff0c;现在提供了PathPatternParse策略&#xff0c;并且可以让我们指定到底使用哪种策略 PathPatternParser: 在jmh基准测试下&#xff…

人工智能、机器学习、深度学习的区别

人工智能涵盖范围最广&#xff0c;它包含了机器学习&#xff1b;而机器学习是人工智能的重要研究内容&#xff0c;它又包含了深度学习。 人工智能&#xff08;AI&#xff09; 人工智能是一门以计算机科学为基础&#xff0c;融合了数学、神经学、心理学、控制学等多个科目的交…

【计算机毕设选题推荐】口腔助手小程序SpringBoot+Vue+小程序

前言&#xff1a;我是IT源码社&#xff0c;从事计算机开发行业数年&#xff0c;专注Java领域&#xff0c;专业提供程序设计开发、源码分享、技术指导讲解、定制和毕业设计服务 项目名 基于SpringBoot的口腔助手小程序 技术栈 SpringBootVue小程序MySQLMaven 文章目录 一、口腔…

vant组件是使用?

首先 在vue项目中使用的时候 要先下载组件 使用npm安装 # Vue 3 项目&#xff0c;安装最新版 Vant npm i vant# Vue 2 项目&#xff0c;安装 Vant 2 npm i vantlatest-v2 使用yarn安装或pnpm # 通过 yarn 安装 yarn add vant# 通过 pnpm 安装 pnpm add vant 在框架中引入即…

漏洞扫描系统的主要功能有哪些

漏洞扫描系统是一种自动化的工具&#xff0c;用于发现和报告计算机网络系统中的安全漏洞。这些漏洞可能包括软件漏洞、配置错误、不安全的网络设备等。漏洞扫描系统的主要功能包括以下几个方面&#xff1a; 目标识别&#xff1a;漏洞扫描系统首先需要识别目标系统的基本信息&am…

【Mysql】B+树索引的使用(七)

前言 每个索引都对应一棵 B 树&#xff0c; B 树分为多层&#xff0c;最下边一层是叶子节点&#xff0c;其余的是内节点&#xff08;非叶子节点&#xff09;。所有用户记录都存储在 B 树的叶子节点&#xff0c;所有目录项记录都存储在内节点。 InnoDB 存储引擎会自动为主键&am…

5、k8s部署Nginx Proxy Manager

前言 Nginx-Proxy-Manager 是一个基于 Web 的 Nginx 服务器管理工具&#xff0c;它允许用户通过浏览器界面轻松地管理和监控 Nginx 服务器。通过 Nginx-Proxy-Manager&#xff0c;可以获得受信任的 SSL 证书&#xff0c;并通过单独的配置、自定义和入侵保护来管理多个代理。用…