运算符用于在程序运行时执行数学或逻辑运算。

Go 语言内置的运算符有:算术运算符赋值运算符逻辑运算符关系运算符位运算符其他运算符

算术运算符

算数运算符是对数值型的变量进行运算的,比如:加减乘除,在Go程序中使用的非常多。

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

运算符 描述 实例
+ 相加 A + B 输出结果13
- 相减 A - B 输出结果 7
* 相乘 A * B 输出结果 30
/ 相除 A / B 输出结果 3
% 求余 A % B 输出结果 1
++ 自增 A++ 输出结果 11
-- 自减 A-- 输出结果 2

注意事项

  1. 对于除号"/",它的整数除和小数除是有区别的:整数之间做除法时,只保留整数部分而舍弃小数部分(而非四舍五入)。例如:10 / 3 = 3; 10.0 / 3 = 3.333; 18 / 5 = 3

    var res int = 10 / 3 //正确
    var res int = 10.0 / 3 //错误,右边计算的结果是float类型,而左边的变量是int类型,不可以赋值
  2. 对于一个数取模时(例如:A % B),可以等价A % B = A - A / B * B,这样我们可以看到取模的一个本质运算。-10 % 3 和10 % -3的结果是不一样的

    -10 % 3 = -10 - ( -10 / 3) * 3
    
            = -10 - (-3 * 3)
    
     	    = -10+9
    
    	    = -1
    10 % -3 = 10 - (10 / -3) * -3
    = 10 - (-3) * -3
    = 10 - 9
    = 1
  3. Golang的自增自减只能当做一个独立语句使用,不能出现在赋值语句的右边(例如:var res int = n++),也不能像if i++ > 0 {}这样使用

  4. Golang的++和—只能写在变量的后面,不能写在变量的前面,即:只有a++,没有++a

  5. Golang的设计者去掉C/Java中的自增自减得容易混淆的写法,让Golang更加简洁、统一。(强制性的)

如何计算A%B的结果呢?

公示:A % B = A - A / B * B

-10 % 3 = -10 - ( -10 / 3) * 3

        = -10 - (-3 * 3)

 	    = -10+9

	    = -1
10 % -3 = 10 - (10 / -3) * -3
= 10 - (-3) * -3
= 10 - 9
= 1

赋值运算符

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

运算符 描述 实例
= 简单的赋值运算符,将一个表达式的值赋给一个左值 C = A + B 将 A + B 表达式结果赋值给 C
+= 相加后再赋值 C += A 等于 C = C + A
-= 相减后再赋值 C -= A 等于 C = C - A
*= 相乘后再赋值 C *= A 等于 C = C * A
/= 相除后再赋值 C /= A 等于 C = C / A
%= 求余后再赋值 C %= A 等于 C = C % A
<<= 左移后赋值 C <<= 2 等于 C = C << 2
>>= 右移后赋值 C >>= 2 等于 C = C >> 2
&= 按位与后赋值 C &= 2 等于 C = C & 2
^= 按位异或后赋值 C ^= 2 等于 C = C ^ 2
|= 按位或后赋值 C |= 2 等于 C = C | 2

逻辑运算符

用于连接多个条件(一般来讲就是关系表达式),最终的结果也是一个bool值。

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

运算符 描述 实例
&& 逻辑 AND 运算符。 如果两边的操作数都是 True,则条件 True,否则为 False。 (A && B) 为 False
|| 逻辑 OR 运算符。 如果两边的操作数有一个 True,则条件 True,否则为 False。 (A || B) 为 True
! 逻辑 NOT 运算符。 如果条件为 True,则逻辑 NOT 条件 False,否则为 True。 !(A && B) 为 True

短路与和短路或

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

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

关系运算符

关系运算符的结果都是bool型,要么是true,要么是false;关系表达式经常用在if结构的条件中或循环结构的条件中

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

运算符 描述 实例
== 检查两个值是否相等,如果相等返回 true 否则返回 false。 (A == B) 为 false
!= 检查两个值是否不相等,如果不相等返回 true 否则返回 false。 (A != B) 为 true
> 检查左边值是否大于右边值,如果是返回 true 否则返回 false。 (A > B) 为 false
< 检查左边值是否小于右边值,如果是返回 true 否则返回 false。 (A < B) 为 true
>= 检查左边值是否大于等于右边值,如果是返回 true 否则返回 false。 (A >= B) 为 false
<= 检查左边值是否小于等于右边值,如果是返回 true 否则返回 false。 (A <= B) 为 true

位运算符

位运算符对整数在内存中的二进制位进行操作。(这里不理解的可以先看008.计算机进制介绍)

下表列出了位运算符 &, |, 和 ^ 的计算:

p q p & q p | q p ^ q
0 0 0 0 0
0 1 0 1 1
1 1 1 1 0
1 0 0 1 1

假定 A = 60; B = 13; 其二进制数(求它们的补码,实际上是对补码进行运算)转换为:

A   = 0011 1100

B   = 0000 1101

-----------------

A&B = 0000 1100

A|B = 0011 1101

A^B = 0011 0001

计算机内部采用补码进行运算

A+B
A的原码为: 0011 1100
A的反码为: 0011 1100
A的补码为: 0011 1100
B的原码为: 0000 1101
B的反码为: 0000 1101
B的补码为: 0000 1101
A + B
0011 1100
0000 1101
--------------
0100 1001 0100 1001转换为10进制整数就是73 A-B = A + (-B)
A的原码为: 0011 1100
A的反码为: 0011 1100
A的补码为: 0011 1100
-B的原码为: 1000 1101
-B的反码为: 1111 0010
-B的补码为: 1111 0011
A - B =
0011 1100
1111 0011
--------------
0010 1111 0010 1111转换为10进制整数就是47 需要注意的是如果得到的结果是正数,则补码就是原码,但是如果得到的结果是负数,则需要将补码-1取反变成原码后再转换成整数
B - A
-A的原码为: 1011 1100
-A的反码为: 1100 0011
-A的补码为: 1100 0100
B的原码为: 0000 1101
B的反码为: 0000 1101
B的补码为: 0000 1101
B - A =
1100 0100
0000 1101
--------------
1101 0001
根据补码符号位可以看出结果为负数,所以需要先-1转换为反码1101 0000,然后符号位不变,取反为原码为1010 1111即为-47

Go 语言支持的位运算符如下表所示。假定 A 为60,B 为13:

运算符 描述 实例
& 按位与运算符"&"是双目运算符。 其功能是参与运算的两数各对应的二进位相与。 (A & B) 结果为 12, 二进制为 0000 1100
| 按位或运算符"|"是双目运算符。 其功能是参与运算的两数各对应的二进位相或 (A | B) 结果为 61, 二进制为 0011 1101
^ 按位异或运算符"^"是双目运算符。 其功能是参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。 (A ^ B) 结果为 49, 二进制为 0011 0001
<< 左移运算符"<<"是双目运算符。左移n位就是乘以2的n次方。 其功能把"<<"左边的运算数的各二进位全部左移若干位,由"<<"右边的数指定移动的位数,高位丢弃,低位补0。 A << 2 结果为 240 ,二进制为 1111 0000
>> 右移运算符">>"是双目运算符。右移n位就是除以2的n次方。 其功能是把">>"左边的运算数的各二进位全部右移若干位,">>"右边的数指定移动的位数。 A >> 2 结果为 15 ,二进制为 0000 1111
package main

import "fmt"

func main() {

   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

其他运算符

下表列出了Go语言的其他运算符。

运算符 描述 实例
& 返回变量存储地址 &a; 将给出变量的实际地址。
* 指针变量。 *a; 是一个指针变量

运算符优先级

运算符有不同的优先级,所谓优先级就是表达式运算中的运算顺序。如下表,上一行运算符的优先级总是优于下一行。

只有单目运算符、赋值运算符是从右向左运算的。

分类 描述 关联性
后缀 () [] -> . ++ -- 左到右
单目 + - ! ~ (type) * & sizeof 右到左
乘法 * / % 左到右
加法 + - 左到右
移位 << >> 左到右
关系 < <= > >= 左到右
相等 == != 左到右
按位AND & 左到右
按位XOR ^ 左到右
按位OR | 左到右
逻辑AND && 左到右
逻辑OR || 左到右
赋值运算符 = += -= *= /= %= >>= <<= &= ^= |= 右到左
逗号 , 左到右

说明:Go语言不支持三元运算符。

Golang设计理念

一种事情有且只有一种方法完成

Go语言运算符的更多相关文章

  1. C语言运算符和优先级

    关于C语言运算符和优先级,经整理众多博客资料汇入自己的实战,如下:        a.算术运算        C语言一共有34种运算符,包括常见的加减乘除运算.        1) 加法:+ 还可以表 ...

  2. 不可或缺 Windows Native (3) - C 语言: 运算符,表达式,条件语句,循环语句,转向语句,空语句等

    [源码下载] 不可或缺 Windows Native (3) - C 语言: 运算符,表达式,条件语句,循环语句,转向语句,空语句等 作者:webabcd 介绍不可或缺 Windows Native  ...

  3. 一道c语言运算符优先级问题

    一道c语言运算符优先级问题 #include <iostream> using namespace std; int main() { char test[] = {"This ...

  4. [转]说说C语言运算符的“优先级”与“结合性”

    补充自己的一点理解: 1.关于++i 与 i++的区别. ++i 和 i++如果是单独使用的语句,即二者后面均加上分号,或者其他单独使用的语句,没有任何区别.例如: for(i=0;i<100; ...

  5. 李洪强-C语言7-C语言运算符

    C语言运算符 一.算术运算 C语言一共有34种运算符,包括常见的加减乘除运算. ①. 加法:+ 还可以表示正号 ②. 减法:- 还可以表示负号 ③. 乘法:* 非数学意义上的X ④. 除法:/  注意 ...

  6. C语言的本质(7)——C语言运算符大全

    C语言的本质(7)--C语言运算符大全 C语言的结合方向 C语言中各运算符的结合性分为两种,即左结合性(自左至右)和右结合性(自右至左).例如算术运算符的结合性是自左至右,即先左后右.如有表达式 x- ...

  7. C语言运算符优先级总结

    一 写在开头1.1 本文内容本文内容为C语言中运算符优先级的总结.转载于:https://blog.csdn.net/huangblog/article/details/8271791,感谢原作者的付 ...

  8. C语言运算符优先级和ASCII表

    1. C语言运算符优先级及结合性 优先级 运算符 名称或含义 使用形式 结合方向 说明 1 [] 数组下标 数组名[常量表达式] 左到右 -- () 圆括号 (表达式)/函数名(形参表) -- . 成 ...

  9. 说说C语言运算符的“优先级”与“结合性”

    论坛和博客上常常看到关于C语言中运算符的迷惑,甚至是错误的解读.这样的迷惑或解读大都发生在表达式中存在着较为复杂的副作用时.但从本质上看,仍然是概念理解上的偏差.本文试图通过对三个典型表达式的分析,集 ...

  10. C语言运算符优先级及结合性

    今天去翻了下C语言运算符的优先级和结合性,发现当初学习的时候就没认真记住,惭愧.发现一篇讲得不错的文章,编辑了下转来供以后翻阅. C语言运算符优先级表(由上至下,优先级依次递减) 运算符 结合性 () ...

随机推荐

  1. 550 5.7.1 Client does not have permissions to send as this sender

    收发邮件时出现以上这种情况,系统提示550 5.7.1 Client does not have permissions to send as this sender,这是什么原因赞成的呢? 活动目录 ...

  2. ArcGIS自定义工具箱-字段分割

    ArcGIS自定义工具箱-字段分割 联系方式:谢老师,135-4855-4328,xiexiaokui#qq.com 目的:用指定分割符分割字段, 用例:湖南省长沙市=>湖南/长沙 数据源: 使 ...

  3. ELK收集Nginx|Tomcat日志

    1.Nginx 日志收集,先安装Nginx cd /usr/local/logstash/config/etc/,创建如下配置文件,代码如下 Nginx.conf input { file { typ ...

  4. spring cloud 总结

    Finchley版本Spring Cloud Finchley; Spring Boot 2.0.3 史上最简单的 SpringCloud 教程 | 第一篇: 服务的注册与发现(Eureka)(Fin ...

  5. 配置MQTT服务器

    第一步:下载一个Xshell 链接:https://pan.baidu.com/s/16oDa5aPw3G6RIQSwaV8vqw 提取码:zsb4 打开Xshell 前往MQTT服务器软件下载地址: ...

  6. c#: 任务栏进度显示(TaskbarManager)

    Win7及以上系统支持任务栏进度条,为有进度类应用显示进度于任务栏,甚为方便. 以c#之WinForm实现其,大多采用Windows API Code Pack这个方案,加多引用,比较繁琐,而我总也打 ...

  7. 正则RegExp的懒惰性和贪婪性; 分组捕获;

    1.正则的懒惰性??? 每次在它的方法exec中捕获的时候,只捕获第一次匹配的内容,而不往下捕获,我们把这种情况称为正则的懒惰性 且每一次捕获的位置都是从索引0开始 正则的实例对象上有一个lastin ...

  8. Quartz.NET快速入门指南

    最近,在工作中遇到了 Quartz.net 这个组件,为了更好的理解项目代码的来龙去脉,于是决定好好的研究一下这个东西.确实是好东西,既然是好东西,我就拿出来分享一下.万丈高楼平地起,我们也从入门开始 ...

  9. 3U - 算菜价

    妈妈每天都要出去买菜,但是回来后,兜里的钱也懒得数一数,到底花了多少钱真是一笔糊涂帐.现在好了,作为好儿子(女儿)的你可以给她用程序算一下了,呵呵. Input 输入含有一些数据组,每组数据包括菜种( ...

  10. jsp相关笔记(三)

    在往数据库的表中写入数据时,一定要与表中的每一项对应,比如表中有三项,则写入的值也应该是三类: String getTitle=request.getParameter("title&quo ...