草庐IT

04 Golang 运算符

cdcx 2023-03-28 原文

一、算术运算符

运算符描述
+ 相加
- 相减
* 相乘
/ 相除
% 求余

代码示例:

 1 package main
 2  3 import "fmt"
 4  5 func main() {
 6     // 算术运算符
 7     a := 5
 8     b := 2
 9 10     fmt.Printf("a+b=%v\n", a+b) // a+b=7
11     fmt.Printf("a-b=%v\n", a-b) // a-b=3
12     fmt.Printf("a*b=%v\n", a*b) // a*b=10
13     fmt.Printf("a/b=%v\n", a/b) // a/b=2
14     fmt.Printf("a%%b=%v\n", a%b) // a%b=1 想要打印%号,可以用%转义,即 %%
15 }

注意: ++(自增)和 --(自减)在Go语言中是单独的语句,并不是运算符。

 1 package main
 2  3 import "fmt"
 4  5 func main() {
 6     a := 5
 7     b := 2
 8     
 9     if a > 4 {
10         a++
11     } else {
12         a--
13     }
14     fmt.Print(a)
15 }

二、关系运算符

运算符描述
== 检查两个值是否相等,如果相等返回 True 否则返回 False。
!= 检查两个值是否不相等,如果不相等返回 True 否则返回 False。
> 检查左边值是否大于右边值,如果是返回 True 否则返回 False。
>= 检查左边值是否大于等于右边值,如果是返回 True 否则返回 False。
< 检查左边值是否小于右边值,如果是返回 True 否则返回 False。
<= 检查左边值是否小于等于右边值,如果是返回 True 否则返回 False。
 1 package main
 2  3 import "fmt"
 4  5 func main() {
 6     a := 5
 7     b := 2
 8  9     fmt.Println(a == b) // false
10     fmt.Println(a != b) // true
11     fmt.Println(a > b)  // true
12     fmt.Println(a >= b) // true
13     fmt.Println(a < b)  // false
14     fmt.Println(a <= b) // false
15 }

 

三、逻辑运算符

运算符描述
&& 逻辑 AND 运算符。 如果两边的操作数都是 True,则为 True,否则为 False。
|| 逻辑 OR 运算符。 如果两边的操作数有一个 True,则为 True,否则为 False。
! 逻辑 NOT 运算符。 如果条件为 True,则为 False,否则为 True。
 
 1 package main
 2  3 import "fmt"
 4  5 func main() {
 6     a := 5
 7     b := 2
 8     c := 3
 9 10     fmt.Println(a > b && c > b) // true
11     fmt.Println(a < b && c > b) // false
12 13     fmt.Println(a > b || c > b) // true
14     fmt.Println(a < b || c < b) // false
15 16     fmt.Println(!(a > b)) // false
17 }

四、位运算符

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

运算符描述
& 参与运算的两数各对应的二进位相与。 (两位均为1才为1)
| 参与运算的两数各对应的二进位相或。 (两位有一个为1就为1)
^ 参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。 (两位不一样则为1)
<< 左移n位就是乘以2的n次方。 “a<<b”是把a的各二进位全部左移b位,高位丢弃,低位补0。
>> 右移n位就是除以2的n次方。 “a>>b”是把a的各二进位全部右移b位。
 
 1 package main
 2  3 import "fmt"
 4  5 func main() {
 6     a := 5 // 0101
 7     b := 6 // 0110
 8  9     fmt.Println(a & b)  // 4
10     fmt.Println(a | b)  // 7
11     fmt.Println(a ^ b)  // 3
12     fmt.Println(a >> 1) // 2
13     fmt.Println(a << 1) // 10
14 }

分析

 1 a --转换成二进制--> 0101
 2 b -- 转换成二进制--> 0110
 3              0101
 4 a & b --->   0110 
 5            --------
 6              0100  ---> 转换成十进制为 4
 7          
 8              0101
 9 a | b --->   0110 
10            --------
11              0111  ---> 转换成十进制为 7
12 13              0101
14 a ^ b --->   0110 
15            --------
16              0011  ---> 转换成十进制为 3
17              
18 a >> 1 ---> 0101 ---> 所有位向右(后)移动一位,在最前面补0 ---> 0010  ---> 转换成十进制 2
19 20 a << 1 ---> 0101 ---> 所有位向左(前)移动一位,在最后面补0 ---> 1010  ---> 转换成十进制 10

注意,对于位的移动操作,如果超过原本数据类型的长度,只会从后往前保留对应的位数,如:

1 package main
2 3 import "fmt"
4 5 func main() {
6     a := int8(1) // 定义一个八位的整数
7     fmt.Println(a << 10) // 0
8 }

分析

a<<1 ---> 00000001 ---> 所有位向左移动十位在最后面补0 ---> 10000000000 ---> 但是a最长只能是八位,多以只能从右往左保留八位,00000000,转换成十进制结果为0

示例:有一堆数字,如果除了一个数字以外,其他数字都出现了两次,那么如何找到出现一次的数字?

思路:可以使用异或运算操作,0 与任何数值异或的结果都为值本身,相同的值异或结果为 0

 1 package main
 2  3 import "fmt"
 4  5 func main() {
 6     nums := [...]int{1, 1, 2, 3, 2}
 7     obj := 0
 8     for _, v := range nums {
 9         obj ^= v
10     }
11     fmt.Println(obj)
12 }

五、赋值运算符

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

 1 package main
 2  3 import "fmt"
 4  5 func main() {
 6     a := 5
 7  8     var b int
 9     b = a
10     fmt.Println(b)
11 12     a += 2 // a = a + 2
13     a -= 2 // a = a - 2
14     a *= 2 // a = a * 2
15     a /= 2 // a = a / 2
16     a %= 2 // a = a % 2
17 }

 

有关04 Golang 运算符的更多相关文章

  1. ruby - 触发器 ruby​​ 中 3 点范围运算符和 2 点范围运算符的区别 - 2

    请帮助我理解范围运算符...和..之间的区别,作为Ruby中使用的“触发器”。这是PragmaticProgrammersguidetoRuby中的一个示例:a=(11..20).collect{|i|(i%4==0)..(i%3==0)?i:nil}返回:[nil,12,nil,nil,nil,16,17,18,nil,20]还有:a=(11..20).collect{|i|(i%4==0)...(i%3==0)?i:nil}返回:[nil,12,13,14,15,16,17,18,nil,20] 最佳答案 触发器(又名f/f)是

  2. kvm虚拟机安装centos7基于ubuntu20.04系统 - 2

    需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc

  3. ruby - 带括号和 splat 运算符的并行赋值 - 2

    我明白了:x,(y,z)=1,*[2,3]x#=>1y#=>2z#=>nil我想知道为什么z的值为nil。 最佳答案 x,(y,z)=1,*[2,3]右侧的splat*是内联扩展的,所以它等同于:x,(y,z)=1,2,3左边带括号的列表被视为嵌套赋值,所以它等价于:x=1y,z=23被丢弃,而z被分配给nil。 关于ruby-带括号和splat运算符的并行赋值,我们在StackOverflow上找到一个类似的问题: https://stackoverflow

  4. ruby - 定义自定义 Ruby 运算符 - 2

    问题是:除了在“OperatorExpressions”?例如:1%!2 最佳答案 是的,可以创建自定义运算符,但有一些注意事项。Ruby本身并不直接支持它,但是superatorsgem做了一个巧妙的把戏,将运算符链接在一起。这允许您创建自己的运算符,但有一些限制:$geminstallsuperators19然后:require'superators19'classArraysuperator"%~"do|operand|"#{self}percent-tilde#{operand}"endendputs[1]%~[2]#Out

  5. ruby - 在 Ubuntu 14.04 中使用 Curl 安装 RVM 时出错 - 2

    我试图在Ubuntu14.04中使用Curl安装RVM。我运行了以下命令:\curl-sSLhttps://get.rvm.io|bash-sstable出现如下错误:curl:(7)Failedtoconnecttoget.rvm.ioport80:Networkisunreachable非常感谢解决此问题的任何帮助。谢谢 最佳答案 在执行curl之前尝试这个:echoipv4>>~/.curlrc 关于ruby-在Ubuntu14.04中使用Curl安装RVM时出错,我们在Stack

  6. ruby - Ruby 中 <=> 运算符的名称是什么?他们怎么调用它? - 2

    在Ruby中有运算符(operator)。在API中,他们没有命名它的名字,只是:Theclassmustdefinetheoperator...Comparableusestoimplementtheconventionalcomparison......theobjectsinthecollectionmustalsoimplementameaningfuloperator...它叫什么名字? 最佳答案 参见上面的@Tony。然而,它也被称为(俚语)“宇宙飞船运算符(operator)”。

  7. ruby - 将运算符传递给函数? - 2

    也许这听起来很荒谬,但我想知道这对Ruby是否可行?基本上我有一个功能...defadda,bc=a+breturncend我希望能够将“+”或其他运算符(例如“-”)传递给函数,这样它就类似于...defsuma,b,operatorc=aoperatorbreturncend这可能吗? 最佳答案 两种可能性:以方法/算子名作为符号:defsuma,b,operatora.send(operator,b)endsum42,23,:+或者更通用的解决方案:采取一个block:defsuma,byielda,bendsum42,23,

  8. ruby - OR 运算符和 Ruby where 子句 - 2

    可能真的很简单,但我很难在网上找到关于这个的文档我在Ruby中有两个activerecord查询,我想通过OR运算符连接在一起@pro=Project.where(:manager_user_id=>current_user.id)@proa=Project.where(:account_manager=>current_user.id)我是ruby​​的新手,但我自己尝试使用||@pro=Project.where(:manager_user_id=>current_user.id||:account_manager=>current_user.id)这没有用,所以1.我想知道如何在

  9. ruby - Ruby 中字符串运算符 + 和 << 的区别 - 2

    我是Ruby和这个网站的新手。下面两个函数是不同的,一个在函数外修改变量,一个不修改。defm1(x)x我想确保我理解正确-当调用m1时,对str的引用被复制并传递给将其视为x的函数。运算符当调用m2时,对str的引用被复制并传递给将其视为x的函数。运算符+创建一个新字符串,赋值x=x+"4"只是将x重定向到新字符串,而原始str变量保持不变。对吧?谢谢 最佳答案 String#+::str+other_str→new_strConcatenation—ReturnsanewStringcontainingother_strconc

  10. ruby - 我可以在 Ruby 中动态调用数学运算符吗? - 2

    ruby中有这样的东西吗?send(+,1,2)我想让这段代码看起来不那么冗余ifop=="+"returnarg1+arg2elsifop=="-"returnarg1-arg2elsifop=="*"returnarg1*arg2elsifop=="/"returnarg1/arg2 最佳答案 是的,只需像这样使用send(或者更好的是public_send):arg1.public_send(op,arg2)这是可行的,因为Ruby中的大多数运算符(包括+、-、*、/、andmore)只需调用方法。所以1+2与1.+(2)相同

随机推荐