Go_运算符及优先级

运算符:

  • 很久以前,流传程序=算法+数据这样的说法。
  • 算法是什么?通俗点说就是解决问题的过程。小到加法指令,大到成千上万台服务器组成的分布式计算集群。抛去抽象概念和宏观架构,最终都由最基础的机器指令过程去处理不同层次存储设备里的数据。学习语言和设计架构不同,我们所关心的就是微观层次,诸如语法规则所映射的机器指令, 以及数据存储位置和格式等等。其中,运算符和表达式用来串联数据和指令,算是最基础的算法。

运算符列表:

+    &   +=   &=    &&   ==		!=		( )
-    |   -=   |=    ||    < 	<= 		[ ]
*    ^   *=   ^=    <-    >		>= 		{ }
/   <<   /=		<<=		++    =		:=		,	;
%   >>   %= 	>>=		--    !		...		. :&^        &^=

一元运算符优先级最高,二元则分成五个级别,从高往低分别是:

  • 相同优先级的二元运算符,从左往右依次计算
  • 一元运算符:运算中只有1个操作数参与,如:i++,i–
  • 二元运算符:运算中只有2个操作数参与,如:+ - * / % a+b
最高				* 		/ 		%		<<		>>		&		&^+ 		- 		| 		^== 		!= 		< 		<= 		> 		>=&&
最低 			||

没有乘幂和绝对值运算符,对应的是标准库math里的Pow、Abs函数实现。

二元运算符:

操作数类型必须相同,除非是无显式类型声明的常量,且该常量操作数会自动转换为另一 操作数类型。

func main() {const i = 1 // 无显式类型声明的常量var j byte = 10fmt.Printf("%T\t%T\n", i, j) // int     uint8b := i + j // b自动转换为uint8类型。fmt.Printf("%T, %v\n", b, b)const x float32 = 1.1d := x + i // v自动转换为float32类型。fmt.Printf("%T, %v\n", d, d)
}

算术运算符:

+:加
-:减
*:乘
/:除,取结果的商
%:取余,取结果的余数
整数操作只能得到整数,要想得到小数,必须有浮点数参与运算。/和%运算除数不能为0

演示:

func main() {a := 1b := 2c := 0fmt.Println("a + b = ", a+b) //3fmt.Println("a - b = ", a-b) //-1fmt.Println("a * b = ", a*b) //2fmt.Println("a / b = ", a/b) //0fmt.Println("a % b = ", a%b) //1fmt.Println("a / c = ", a/c) //panic: runtime error: integer divide by zerofmt.Println("a % c = ", a%c) //panic: runtime error: integer divide by zero
}

字符+

两边都是数值时,+号是做加法运算,两边都是字符串时是做字符串拼接
char类型参与算术运算,使用的是计算机底层对应的十进制数值。
‘a’ --------- 97 a-z是连续的,'b’对应的值是98,'c’是99
‘A’ --------- 65 A-Z是连续的,'B’对应的值是66,'C’是67
‘0’ --------- 48 0-9是连续的,'1’对应的值是49,'2’是50

func main() {a := 'a'b := 'A'c := '0'fmt.Println(a + 1) // 98fmt.Println(b + 1) // 66fmt.Println(c + 1) // 49
}

自增自减运算:

自增、自减运算符只能作为独立语句,不能用于表达式。
表达式通常是求值代码,可作为右值或参数使用。表达式可作为语句用,但语句却不能当做表达式。

符号作用说明
++自增变量的值加1
- - 自减变量的值减1

++和-- 只能放在变量的后面使用,不支持放在前面
参与操作的时候,如果放在变量的后边,先拿变量参与操作,后拿变量做++或者–。
最常见的用法:单独使用。

func main() {a := 1a++// ++a 不支持fmt.Println("a = ", a) // 2a--fmt.Println("a = ", a) // 1
}

赋值运算符:

作用:将一个表达式的值赋给左边,左边必须是可修改的,不能是常量。赋值运算符隐含了强制类型转换。

符号作用说明
=普通赋值a=10,将10赋值给变量a
+=加后赋值a+=b,将a+b的值给a
-=减后赋值a-=b,将a-b的值给a
*=乘后赋值a*=b,将a×b的值给a
/=除后赋值a/=b,将a÷b的商给a
%=取余后赋值a%=b,将a÷b的余数给a
<<=左移后赋值a<<=b,将a与b的余数给a
>>=右移后赋值a>>=b,将a与b的余数给a
&=与后赋值
^=异或后赋值
`=`或后赋值

赋值运算符和算术运算符一起使用的时候,会优先计算算术运算符

func main() {var sum = 100sum += 5     //105sum /= 5 + 5 // sum = sum /(5+5)fmt.Println(sum)
}

关系运算符:

符号说明
==a==b,判断a和b的值是否相等,成立为true,不成立为false
!=a!=b,判断a和b的值是否不相等,成立为true,不成立为false
>a>b,判断a是否大于b,成立为true,不成立为false
>=a>=b,判断a是否大于等于b,成立为true,不成立为false
<a<b,判断a是否小于b,成立为true,不成立为false
<=a<=b,判断a是否小于等于b,成立为true,不成立为false

关系运算符的结果都是boolean类型,要么是true,要么是false。
不要把==写成=,==是判断是否相等,=是赋值

关系运算符和算术运算符、赋值运算符一起运算时的优先级是

算术运算符 > 关系运算符 > 赋值运算符

func main() {num1 := 1num2 := 2sum := num1+3 > num2                      // 先计算num1+3,再拿num1+3的结果和num2比较,最后赋值给sumfmt.Println("num1 == num2", num1 == num2) //falsefmt.Println("num1 != num2", num1 != num2) //truefmt.Println("num1 > num2", num1 > num2)   //falsefmt.Println("num1 >= num2", num1 >= num2) //falsefmt.Println("num1 < num2", num1 < num2)   //truefmt.Println("num1 <= num2", num1 <= num2) //truefmt.Println("sum = ", sum)                //true
}

逻辑运算符:

逻辑运算符把各个运算的关系表达式连接起来组成一个复杂的逻辑表达式,以判断程序中的表达式是否成立,判断的结果是 true 或 false。
在逻辑与运算中,只要有一个表达式的值为false,那么结果就可以判定为false了,没有必要将所有表达式的值都计算出来,短路与操作就有这样的效果,可以提高效率。同理在逻辑或运算中,一旦发现值为true,右边的表达式将不再参与运算。

符号作用说明
!逻辑非如果条件为true,则为fasle,也就是取反
&& 短路与两个数都是true则为true,否则为false(如果第一个条件为false,则不会执行第二个条件,结果直接为false)
``
func main() {a := 1b := 2c := 3fmt.Println(a > b && b < c)           // falsefmt.Println(a > b || b < c)           // truefmt.Println(!(a > 6))                 // truefmt.Println(a > b || a > b && a != 1) // false
}

位运算符:

位运算符是对整数在内存中的二进制进行操作的

运算符描述
&参与运算的两个数对应的二进制位相与,两位都是1才为1
|参与运算的两个数对应的二进制位相或,两位有1个是1就为1
^参与运算的两个数对应的二进制位相异或,两位不同则为1
<<左移n位就是乘以2的n次方
>>右移n位就是除以2的n次方
func main() {a := 10 // 10的二进制1010b := 11 // 11的二进制1011// 下面都是对10和2的二进制进行操作,首先会先转换成二进制数,然后在运算fmt.Println(a & b)  // 1010 = 10fmt.Println(a | b)  // 1011 = 11fmt.Println(a ^ b)  // 0001 = 1// fmt.Println(a << b) // 20480fmt.Println(a >> b) // 0
}

运算符优先级:

优先级值越大,表示优先级越高

优先级分类运算符结合性
1逗号运算符,从左到右
2赋值运算符=、+=、-=、*=、/=、 %=、 >=、 <<=、&=、^=、|=从右到左
3逻辑或||从左到右
4逻辑与&&从左到右
5按位或|从左到右
6按位异或^从左到右
7按位与&从左到右
8相等/不等==、!=从左到右
9关系运算符<、<=、>、>=从左到右
10位移运算符<<、>>从左到右
11加法/减法+、-从左到右
12乘法/除法/取余*(乘号)、/、%从左到右
13单目运算符!、*(指针)、& 、++、–、+(正号)、-(负号)从右到左
14后缀运算符( )、[ ]、->从左到右

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/572125.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mvn 修改所有子项目pom版本

mvn versions:set -DgenerateBackupPomsfalse -DnewVersion1.3.0 转载于:https://www.cnblogs.com/sidesky/p/7344713.html

Go_流程、跳转控制语详解

流程控制语句分类&#xff1a; 流程控制语句可以控制代码的执行顺序和条件 顺序结构&#xff1a;普通的代码&#xff0c;由上而下依次执行分支结构(if, switch)循环结构(for) if语句&#xff1a; 条件表达式值必须是bool类型&#xff0c;不可省略括号&#xff0c;且左大括号…

HDU 4027 Can you answer these queries?(线段树/区间不等更新)

传送门 Can you answer these queries? Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Others)Total Submission(s): 18290 Accepted Submission(s): 4308 Description A lot of battleships of evil are arranged in a line before the b…

Go_秒懂函数、参数、可变参数、匿名函数、回调函数、内置函数

函数是将具有独立功能的代码块组成一个整体&#xff0c;使其具有特殊功能的代码集。它将复杂的算法过程分解为若干个小任务&#xff0c;隐藏相关细节&#xff0c;使得程序结构更加清晰&#xff0c;易于维护。通过接收输入参数完成一段算法指令&#xff0c;输出或存储相关结果。…

NE2018届校招内推笔试——数据挖掘

【单选题|2分/题】 1、在只有两类的情况下&#xff0c;二维特征向量通过共享相同的协方差矩阵的正态分布生成&#xff0c;其中协方差矩阵为&#xff1a; 均值向量分别为&#xff1a;&#xff0c;则根据贝叶斯分类&#xff0c;样本分类为&#xff1a;&#xff08;&#xff09; A…

Go_数组遍历、最大值、求和、多维数组

数组&#xff1a; 数组就是用来存储数据的容器&#xff0c;存储多个数据时数据类型要一致。如果想要保存任意类型数据&#xff0c;需要声明为接口类型数组数组定义完成后&#xff0c;可以对数组进行赋值操作。数组是通过下标来进行操作的&#xff0c;下标的范围是从0开始到数组…

全局变量和环境变量的区别

全局变量:启动脚本了.在各线程,以及主程序中.可以互相传递值.每次启动脚本,初始值都一样.环境变量:启动脚本了.在各线程,以及主程序中.可以互相传递值.每次启动脚本,初始值是上次停止脚本时的值. 例子:Global 全局变量Dimenv 环境变量全局变量 全局变量 1环境变量 环境变量 …

不满足依赖关系

今晚上脑残&#xff0c;替换了实体&#xff0c;把报错的也都替换完成了&#xff0c;但是运行报错&#xff1a; 大概的意思就是说不满足XXXXXX依赖关系&#xff0c;但是找了半天都没有找到&#xff0c;最后是mapper的实体类全路径替换的时候&#xff0c;脑残在后面加上了.java。…

Go_切片(初始化、遍历、截取、修改、append、copy、切片作为函数参数、切片求和、切片求最大值)

切片&#xff1a; 切片的长度是不固定的&#xff0c;可以追加数据&#xff0c;可以理解是一个动态数组&#xff0c;切片的底层是一个结构体切片类型&#xff08;slice&#xff09;本身并不是动态数组或数组指针。它内部通过指针引用底层数组&#xff0c;设定相关属性将操作限定…

Golang——递归的使用

递归指的是函数定义中调用函数本身的现象&#xff08;自己调自己&#xff09;把一个复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算 递归注意事项&#xff1a; 递归一定要有出口。否则内存溢出(出口…

阿里巴巴Java开发手册——速读记录

本随笔基于阿里巴巴Java开发手册V1.2&#xff0c;陆陆续续记录一些现阶段能理解的&#xff0c;有启发的内容&#xff0c;并将持续更新 最佳实践——插件使用已经发布为随笔&#xff01;http://www.cnblogs.com/jiangbei/p/7668654.html 一、编程规范 1.命名规范 &#xff08;1&…

Go_map集合初始化、键值操作、map作为函数参数的使用

map&#xff1a; map是key-value的数据结构&#xff0c;类似于Java的集合&#xff0c;又称为字典&#xff0c;像新华字典就是key:value类型展示的map是无序的&#xff0c;其中key是不允许重复的&#xff0c;key不存在相当于添加&#xff0c;存在相当于修改map的key必须可以进行…

Angular 小试牛刀[1]:Getting Started

首先&#xff0c;Angular2 与 Angular1.x 版本没有多大关系&#xff0c;甚至可以说是两个完全不一样的框架&#xff0c;故 Angular 指的是 Angular2 及以上的版本。而 Angular 与 TypeScript 的完美结合&#xff0c;对于一个 .NET 开发者来说&#xff0c;实在是找不到不用它的理…

Go_指针的使用、数组指针和指针数组、指针与切片、指针与结构体、多级指针

指针&#xff1a; 指针是一个特殊的变量&#xff0c;因为它存储的数据是另一个变量的内存地址&#xff0c;指针本身也是有内存地址的指针的数据类型有int、float、bool、string、数组、结构体指针的作用就是可以通过变量/对象的内存地址去操作变量/对象 注意&#xff1a; 取址运…

linux驱动编写(Kconfig文件和Makefile文件)

在Linux编写驱动的过程中&#xff0c;有两个文件是我们必须要了解和知晓的。这其中&#xff0c;一个是Kconfig文件&#xff0c;另外一个是Makefile文件。如果大家比较熟悉的话&#xff0c;那么肯定对内核编译需要的.config文件不陌生&#xff0c;在.config文件中&#xff0c;我…

Go_结构体与数组、切片、map、方法、作为函数参数、type、Tag

结构体&#xff1a; 结构体是由一系列具有相同类型或不同类型的数据构成的数据集合结构体可以很好的管理数据&#xff0c;使用结构体可以提高程序的易读性&#xff0c;类似于Java的类一样结构体内成员名必须唯一&#xff0c;可用_补位&#xff0c;支持使用自身类型的指针成员。…

vue项目中如何引入ElementUI

1.在cmd中输入命令&#xff1a; npm i element-ui -S 2.在src/main.js文件中增加代码&#xff1a; import ElementUI from element-ui import element-ui/lib/theme-default/index.cssVue.use(ElementUI) 转载于:https://www.cnblogs.com/xuemei/p/7372332.html

Golang——深浅拷贝

浅拷贝&#xff1a;只是拷贝了内存地址&#xff0c;会指向原来的内存&#xff0c;指向原来的内存地址&#xff0c;操作的时候会互相影响 go中的赋值、函数传参、函数返回值都是浅拷贝 深拷贝&#xff1a;会把变量的数据都拷贝一份&#xff0c;包括地址&#xff0c;新的内存地址…

[Java][web]利用Spring随时随地获得Request和Session

利用Spring随时随地获得Request和Session 一、准备工作&#xff1a; 在web.xml中加入 <listener> <listener-class> org.springframework.web.context.request.RequestContextListener</listener-class> </listener>二、用法&#xff1a;…

Golang实现通讯录小案例

代码&#xff1a; package mainimport "fmt"func main() {for {menu()} }type User struct {userName string/**key&#xff1a;表示电话的类型value&#xff1a;电话号码*/addressPhone map[string]string }// 定义切片 var userList make([]User, 0)func menu() …