Golang——多种运算符及优先级
运算符:
- 很久以前,流传
程序=算法+数据
这样的说法。- 算法是什么?通俗点说就是
解决问题的过程
。小到加法指令,大到成千上万台服务器组成的分布式计算集群。抛去抽象概念和宏观架构,最终都由最基础的机器指令过程去处理不同层次存储设备里的数据。学习语言和设计架构不同,我们所关心的就是微观层次,诸如语法规则所映射的机器指令, 以及数据存储位置和格式等等。其中,运算符和表达式用来串联数据和指令,算是最基础 的算法。- 另有一句话:
硬件的方向是物理,软件的结局是数学
全部运算符列表:
+ & += &= && == != ( )
- | -= |= || < <= [ ]
* ^ *= ^= <- > >= { }
/ << /= <<= ++ = := , ;
% >> %= >>= -- ! ... . :&^ &^=
一元运算符
优先级最高,二元则分成五个级别,从高往低分别是:
- 相同优先级的二元运算符,从左往右依次计算
- 一元运算符:运算中只有1个操作数参与,如:i++,i–
- 二元运算符:运算中只有2个操作数参与,如:+ - * / %
a+b
最高 * / % << >> & &^+ - | ^== != < <= > >=&&
最低 ||
没有乘幂和绝对值运算符,对应的是标准库math里的Pow、Abs函数实现。
二元运算符:
操作数类型必须相同,除非是无显式类型声明的常量,且该常量操作数会自动转换为另一 操作数类型。当然,位移操作会有些不同
func main() {const i = 1 // 无显式类型声明的常量var j byte = 10b := i + j // v自动转换为byte/uint8类型。fmt.Printf("%T, %v\n", b, b)const x float32 = 1.1d := x + i // v自动转换为float32类型。fmt.Printf("%T, %v\n", d, d)
}
打印结果:
uint8, 11
float32, 2.1
位移右操作数必须是无符号整数,或可以转换的无显式类型常量
func main() {i := 1 // i是有符号int类型。j := 2 << i // 无效操作:2 << i (2 << i 已评估但未使用)fmt.PrintLn(j)
}
如果是非常量位移表达式,那么会优先将无显式类型的常量左操作数转型
func main() {var i uint = 3j := 1.0 << 3 //常量表达式(包括常量展开)。fmt.Printf("%T,%v\n", j, j) // int, 8x := 1.0 << i // 无效操作:1 << i (shift of type float64)fmt.Printf("%T, %v\n", x, x) // 因为x没有提供类型,那么编译器通过1.0推断,显然无法对浮点数做位移操作。var y int32 = 1.0 << i //自动将1.0转换为int32类型。fmt.Printf("%T, %v\n", y, y) // int32, 8
}
位运算符:
二进制位运算符比较特别的就是bit clear
,在其他语言里很少见到
AND 按位与:都为1 a & b 0101 & 0011 = 0001
OR 按位或:至少一个1 a | b 0101 | 0011 = 0111
XOR 按位亦或:只有一个1 a ^ b 0101 ^ 0011 = 0110
NOT 按位取反(一元) ^a ^0111 = 1000
AND 按位清除(bit clear) a &^ b 0110 &^ 1011 = 0100
LEFT SHIFT 位左移 a << 2 0001 << 3 = 1000
RIGHT SHIFT 位右移 a >> 2 1010 >> 2 = 0010
位清除(and NOT)和位亦或(XOR)是不同的。它的右操作数作用类似位图,将有标记的左操作数对应二进制位重置为0,以达到一次清除多个标记位的目的
const (read2 byte = 1 << iotawriteexecfreeze
)func main() {a := read2 | write | freezeb := read2 | freeze | execc := a &^ b // 相当于a^ read ^ freeze,但不能包括execfmt.Printf("%04b &^ %04b = %04b\n", a, b, c)
}
打印结果:
1011 &^ 1101 = 0010
算术运算符:
+
:加
-
:减
*
:乘
/
:除,取结果的商
%
:取余,取结果的余数
整数操作只能得到整数,要想得到小数,必须有浮点数参与运算。/和%运算除数不能为0
演示:
func test2() {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 test3() {a := 'a'b := 'A'c := '0'fmt.Println(a + 1) // 98fmt.Println(b + 1) // 66fmt.Println(c + 1) // 49
}
自增自减运算:
自增、自减运算符只能作为独立语句,不能用于表达式。
表达式通常是求值代码,可作为右值或参数使用。表达式可作为语句用,但语句却不能当做表达式。
符号 | 作用 | 说明 |
---|---|---|
++
|
自增 | 变量的值加1 |
- -
|
自减 | 变量的值减1 |
++和-- 只能放在变量的后面使用,不支持放在前面
参与操作的时候,如果放在变量的后边,先拿变量参与操作,后拿变量做++或者–。
最常见的用法:单独使用。
func test5() {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 |
赋值运算符和算术运算符一起使用的时候,会优先计算算术运算符
var sum = 100sum += 5 //105sum /= 5 + 5 // sum = sum /(5=5)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 test8() {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,右边的表达式将不再参与运算。
- 短路与&&,如果左边为真,右边执行;如果左边为假,右边不执行。
- 短路或||,如果左边为假,右边执行;如果左边为真,右边不执行。
符号 | 作用 | 说明 |
---|---|---|
!
|
逻辑非 | !a,结果和a的结果正好相反 |
&&
|
短路与 | 作用和&相同,但是有短路效果 |
||
|
短路或 | 作用和|相同,但是有短路效果 |
func test9() {a := 1b := 2c := 3fmt.Println(a > b && b < c) //false 在go语言里似乎只支持&&和||,没有^、&、|fmt.Println(a > b || b < c) //truefmt.Println(!(a > 6)) // truefmt.Println(a > b || a > b && a != 1) //false
}
运算符优先级:
优先级按照先后顺序排序
符号 | 作用 |
---|---|
()
|
.().函数名用的 |
! 单目运算符
|
逻辑非 |
& 单目运算符
|
取地址用的 |
*/% 双目运算符
|
算术运算 |
+- 双目运算符
|
算术运算 |
&& 双目运算符
|
逻辑运算 |
|| 双目运算符
|
逻辑运算 |
=、+=、-=、*=、/= 双目运算符
|
赋值运算 |
Golang——多种运算符及优先级相关推荐
- swift:高级运算符(位运算符、溢出运算符、优先级和结合性、运算符重载函数)...
swift:高级运算符 http://www.cocoachina.com/ios/20140612/8794.html 除了基本操作符中所讲的运算符,Swift还有许多复杂的高级运算符,包括了C语和 ...
- 【C语言】计算含多种运算符的表达式
计算含多种运算符的表达式 引入 运算符的优先级 算术表达式的运算规则 引例 例题 引入 诸如下面这些表达式,它的计算过程,计算顺序是怎样的?计算结果为多少? 今天我们就一起来解决一下这个问题吧! 运算 ...
- C语言 运算符的优先级和结合性是怎样的?
1.问题阐述 各种运算符的优先级是怎样的?结合顺序又是怎样的? 2.专家解答 C语言中的运算符种类丰富,有40多种,分为15种优先级,而且还具有结合性的特点.在表达式中,各运算对象参与运算的先后顺序不 ...
- 在c语言中逗号的作用,C语言逗号运算符应用优先级与运算规则理解
一.逗号运算符介绍 逗号运算符是C语言中常见的数学运算符号儿,多个运算的表达式之间可以用逗号分隔开来,然后用逗号分隔的这几个表达式可以单独进行运算,最后的运算结果取最后一个表达式的值进行返回. 逗号运 ...
- VC++运算符与优先级
C++的优先级 优先级 操作符 结合性 01: :: 左 02: . -> [] () 左 03: ++ -- ~ ! - + & * ...
- C语言语法之运算符及优先级
注:该内容整理自以下链接. http://blog.csdn.net/huangblog/article/details/8271791 表:C语言运算符及优先级 优先级 运算符 名称或含义 使用形式 ...
- (4)javascript的运算符以及运算符的优先级
运算符的使用方法 在javascript的程序中要完成各种各样的运算,是离不开运算符的. 在javascript中,按运算符类型可以分为算术运算符.赋值运算符.比较运算符.逻辑运算符.条件运算符等. ...
- 运算符中,优先级高低总结。
运算符中,优先级高低总结.
- 判断一个整数是否是水仙花数 || 编写程序,根据输入的月份和年份,求出该月的天数(1-12)|| 运算符的优先级问题 ||输出小写的a-z以及大写的Z—A||求出1-1/2+1/3-1/4…..1/
判断一个整数是否是水仙花数,所谓水仙花数是指一个3位数, 其各个位上数字立方和等于其本身.例如: 153 = 1*1*1 + 5*5*5 + 3*3*3 ...
最新文章
- BZOJ 2142 礼物(拓展Lucas,中国剩余定理)【BZOJ修复工程】
- Kubernetes 1.3版本之简单安装
- iOS 推送手机消息背后的技术
- 如何给腾讯云域名申请免费的SSL证书
- 通讯模块板载天线设计方法
- html page背景图片,html – Fullpage.js背景图片
- Spring Session Redis
- 华为扩大内存代码_荣耀手机扩大内存代码_华为手机内存扩大拨号代码
- 电动车实名制挂牌管理系统java+springboot+ssm
- 微信公众号的调试与测试
- grafana图形化数据展示软件介绍
- Android Studio-unity腾讯TiM(即时通信)使用
- 均匀化退火时间_热处理加工均匀化退火要点
- 电子招投标采购系统之电子招标投标的全流程!企业电子招投标系统源码
- window环境下mysql忘记密码或者原正确密码无法登录
- Java HashMap中在resize()时候的rehash,即再哈希法的理解
- Web基础与apache讲解与搭建
- 电子政务信息交换平台与数据中心的构建(转)
- CSR8675的学习笔记:驱动正交编码器
- 荣耀20android版本10什么意思,手机 篇一:荣耀10的老用户要不要换荣耀20Pro
热门文章
- linux+硬盘rd5,Raid磁盘阵列
- c语言include math.h,在C语言中,若需调用数学类库函数第数据进行处理,则需包含头文件______. 答案:math.h;#includemath.h;math.h;“math....
- 关于计算机网络的描述错误的是,【单选题】以下关于计算机网络定义的描述中,错误的是...
- html 页面元素id不唯一,规定html元素的唯一的id属性
- 如何在代码中让按钮高亮_各种博客的代码高亮是如何实现的
- IDEA通过Database连接MySql数据库
- Java 解析URL
- MySQL 过滤重复数据
- 树莓派 小屏幕_树莓派学习手动积累(1)
- 临颖一高2021高考成绩查询,临颍一高举办2021年决战高考百日冲刺誓师大会