9、运算符介绍

2022-12-17 0 1,087

操作符如是说

一、 十元操作符

二、 相互依赖操作符

2.1、数数操作符

2.2、位操作符

2.3、表达式操作符

2.4、较为操作符

2.5、方法论操作符

操作符如是说

操作符用作在程序代码时继续执行微积分或方法论演算,Go 词汇内建的运算符有:

十元操作符

+十元乘法-正数相互依赖操作符

微积分操作符位操作符方法论操作符较为操作符

Go词汇中大部份的相互依赖操作符共计六种错误率,如下表所示右图,它依照错误率递增的次序的排序:

错误率操作符5* / % << >> & &^4+ – | ^3== != < <= > >=2&&1\|\|

在同一错误率,采用左优先选择紧密结合准则,但采用括弧能提高错误率,因此提议采用括弧明晰优先选择次序。

一、 十元操作符

十元的乘法和减法操作符叙述+十元乘法 (无效用)-正数

对有理数、浮点和众数,+x是x,-x则是x 的正数。比如+(-8)得-8

&回到表达式储存门牌号&a; 将得出表达式的前述门牌号。*操作符表达式。*a; 是两个操作符表达式

二、 相互依赖操作符

2.1、数数操作符

操作符叙述+相乘-相乘*相乘/相乘%求余/圣克雷潘

特别注意:

1、微积分操作符+、-、*和/能在有理数、浮点和众数间搞混,但圣克雷潘操作符%仅用作有理数间的演算

fmt.Println(3 % 2) // 1 fmt.Println(3.1 % 2) // 报错:operator % not defined on untyped float
2、在Go词汇中,%圣克雷潘操作符的符号和被圣克雷潘数的符号总是一致的,因此-5%3和-5%-3结果都是-2。
// 能这做 -(-5 % -3)
3、除法操作符/的行为则依赖于操作数是否为全为有理数,比如
fmt.Println(8.0 / 5.0) // 结果为1.6 fmt.Println(8 / 5.0) // 结果为1.6 fmt.Println(8.0 / 5) // 结果为1.6 ​ fmt.Println(8 / 5) // 结果为1,因为有理数除法会向着0方向截断余数。
4、因为除法操作符/会根据操作数的类型生成对应类型的结果,因此不同写法的常量除法表达式可能对应不同的结果:
var f float64 = 212 fmt.Println((f – 32) * 5 / 9) // “100”; (f – 32) * 5 is a float64 fmt.Println(5 / 9 * (f – 32)) // “0”; 5/9 is an untyped integer, 结果为0 fmt.Println(5.0 / 9.0 * (f – 32)) // “100”; 5.0/9.0 is an untyped float
5、针对两个微积分演算的结果,不管是有符号还是无符号的,如果需要更多的bit位才能正确表示的话,就说明计算结果是溢出了,而超出的高位的bit位部分将被丢弃,也是说如果原始的数值是有符号类型,而且最左边的bit为是1的话,那么最终结果就可能是负的,比如int8的例子:
var u uint8 = 255 fmt.Println(u, u+1, u*u) // “255 0 1” ​ var i int8 = 127 fmt.Println(i, i+1, i*i) // “127 -128 1”

???为何出现128呢,egon来先扫一下盲,估计会扫死99%的人

问:8位二进制数能表示的数值范围是多少,99%的人张口就来:-128~127 ​ • ok,8位二进制数,最高位需要用来表示符号,那么剩下的7位用来表示数值 ​ • 于是,最大数为1111 1111=>+127,最小0111 1111=>-127,卧槽,得出的结论是8位二进制数能表示的数值范围是-127到+127,傻逼了吧你,哈哈哈 ​ • 灵魂拷问:-128到底怎么来的??? ​ • 真相是这样的: 8位二进制数用7位表示数值,那么7位2进制数000 0000的值为0 那么,它前面加上符号位0,还表示0吧? 那好,如果它前面加上1呢,仍然表示0?这不是重复了么? 两个0,怎么用两个值来表示呢!!! 因此1000 0000就表示-128啦.

6、字符串也能采用+操作符

其中+操作符将两个字符串链接构造两个新字符串:
fmt.Println(“goodbye” + s[5:]) // “goodbye, world” 字符串能用==和<进行较为;较为通过逐个字节较为完成的,因此较为的结果是字符串自然编码的次序。 字符串的值是不可变的:两个字符串包含的字节序列永远不会被改变,当然我们也能给两个字符串表达式分配两个新字符串值。能像下面这样将两个字符串追加到另两个字符串: s := “left foot” t := s s += “, right foot” 这并不会导致原始的字符串值被改变,但表达式s将因为+=语句持有两个新的字符串值,但t依然是包含原先的字符串值。 fmt.Println(s) // “left foot, right foot” fmt.Println(t) // “left foot”

2.2、位操作符

位操作符对有理数在内存中的二进制位进行操作(详解附录:位演算)

操作符叙述实例<<左移,左移n位是乘以2的n次方。”a<<b”是把a的各二进位全部左移b位,高位丢弃,低位补0。A << 2 结果为 240 ,二进制为 1111 0000>>右移,右移n位是除以2的n次方。 “a>>b”是把a的各二进位全部右移b位。A >> 2 结果为 15 ,二进制为 0000 1111&位演算AND,参与演算的两数各对应的二进位相与。 (两位均为1才为1)(A & B) 结果为 12, 二进制为 0000 1100||位演算OR,参与演算的两数各对应的二进位相或。 (两位有两个为1就为1)(A | B) 结果为 61, 二进制为 0011 1101^位演算XOR,参与演算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。 (两位不一样则为1)(A ^ B) 结果为 49, 二进制为 0011 0001&^位清空 (AND NOT)

2.3、表达式操作符

对数数操作符和位操作符,还紧密结合表达式符号书写成简化的表达式语句,比如+操作符还有两个与表达式相紧密结合的对应操作符+=

操作符叙述=简单的表达式操作符,将两个表达式的值赋给两个左值+=相乘后再表达式-=相乘后再表达式*=相乘后再表达式/=相乘后再表达式%=求余后再表达式<<=左移后表达式>>=右移后表达式&=按位与后表达式|=按位或后表达式^=按位异或后表达式

特别注意1:

在Go语法中,表达式初始化和表达式表达式是两个不同的概念。下面为声明两个表达式之后的表达式 过程:

var v int v = 123

Go词汇的表达式表达式与多数词汇一致,但Go词汇中提供了C/C++程序员期盼多年的多重表达式功 能,比如下表所示面这个交换i和j表达式的语句:

i, j = j, i // 在不支持多重表达式的词汇中,交互两个表达式的内容需要引入两个中间表达式: t = i; i = j; j = t;

多重表达式的特性在Go词汇库的实现中也被采用得相当充分,在如是说函数的多重回到值时, 将对其进行更加深入的介绍。总而言之,多重表达式功能让Go词汇与C/C++词汇相比能非常明显 地减少代码行数。多重表达式细节和原理参照官方文档golang官网:https://golang.org/ref/spec#Constants

特别注意2: 数值表达式也能支持++递增和–递增语句(译注:自增和自减是语句,而不是表达式或操作符,因此x = i++之类的表达式是错误的。语句只是继续执行指令,表达式是在继续执行计算会有回到值):

x:=123 y:=-3.1 x // 等价于 x = x – 1;x 变成 122 y++ // 等级于 y = y + 1;y 变成 -2.1 fmt.Println(x) // 122 fmt.Println(y) // -2.1

2.4、较为操作符

操作符叙述==检查两个值是否相等,如果相等回到 True 否则回到 False。!=检查两个值是否不相等,如果不相等回到 True 否则回到 False。>检查左边值是否大于右边值,如果是回到 True 否则回到 False。>=检查左边值是否大于等于右边值,如果是回到 True 否则回到 False。<检查左边值是否小于右边值,如果是回到 True 否则返回 False。<=检查左边值是否小于等于右边值,如果是回到 True 否则回到 False。

两个相同的有理数类型能采用下面的相互依赖较为操作符进行较为;较为表达式的结果是布尔类型。

事实上,布尔型、数字类型和字符串等基本类型都是可较为的,也是说两个相同类型的值能用==和!=进行较为。此外,有理数、浮点和字符串能根据较为结果排序。许多其它类型的值可能是不可较为的,因此也就可能是不可排序的。对我们遇到的每种类型,我们需要保证准则的一致性。

2.5、方法论操作符

操作符叙述&&方法论 AND 操作符。 如果两边的操作数都是 True,则为 True,否则为 False。||方法论 OR 操作符。 如果两边的操作数有两个 True,则为 True,否则为 False。!方法论 NOT 操作符。 如果条件为 True,则为 False,否则为 True。

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务