package main
import"fmt"funcmain(){// 如果运算符两边都是整数,那么运算后会直接去掉小数部分,只保留整数部分
fmt.Println(10/4)// 2// 如果我们希望保留小数部分,则需要有浮点数参与运算
fmt.Println(10.0/4)// 2.5}
取模%运算符的使用特点
package main
import"fmt"funcmain(){// 取模运算公式:a % b = a - a / b * b
fmt.Println(10%3)// 1
fmt.Println(10%-3)// 1
fmt.Println(-10%3)// -1
fmt.Println(-10%-3)// -1// 总结:取模后结果的符号由运算符左边决定}
自增++和自减--运算符的使用特点
package main
import"fmt"funcmain(){var a =1// 注意:自增和自减在Go语言中是单独的语句(语句需要单独写在一行),并不是运算符// 由于独占一行,此时前置和后置就没有了区别,所以Go中没有前置++和前置--
a++
fmt.Println(a)// 2
a--
fmt.Println(a)// 1}
关系运算符
运算符
描述
==
检查两个值是否相等,如果相等返回 True 否则返回 False
!=
检查两个值是否不相等,如果不相等返回 True 否则返回 False
>
检查左边值是否大于右边值,如果是返回 True 否则返回 False
>=
检查左边值是否大于等于右边值,如果是返回 True 否则返回 False
<
检查左边值是否小于右边值,如果是返回 True 否则返回 False
<=
检查左边值是否小于等于右边值,如果是返回 True 否则返回 False
关系运算的结果都是bool型,要么是true,要么是false
关系表达式经常用在if结构的条件中或循环结构的条件中
逻辑运算符
运算符
描述
&&
如果两边的操作数都是 True,则为 True,否则为 False
||
如果两边的操作数有一个 True,则为 True,否则为 False
!
如果条件为 True,则为 False,否则为 True
演示[短路与]、[短路或]
package main
import"fmt"funcabc()bool{
fmt.Println("abc")returntrue}funcmain(){var a =10if a <9&&abc(){// a < 9值为false,所以不执行函数abc(),最后什么都不输出
fmt.Println("测试")}}
package main
import"fmt"funcabc()bool{
fmt.Println("abc")returntrue}funcmain(){var a =10if a >9||abc(){// a > 9值为true,所以不执行函数abc(),最后只输出"测试"
fmt.Println("测试")}}
package main
import"fmt"funcmain(){var a int8
a =-103
fmt.Println(a >>3)// -13}/*
-103的原码:1110 0111
-103的反码:1001 1000
-103的补码:1001 1001
补码右移三位(符号位补高位): 111 10011
反码=补码-1: 111 10010
原码=反码符号位不变,其它位取反: 100 01101 => -13
*/
左移运算符<<:高位溢出,符号位不变,低位补0
赋值运算符
运算符
描述
=
将一个表达式的值赋给一个左值
+=
相加后再赋值
-=
相减后再赋值
*=
相乘后再赋值
/=
相除后再赋值
%=
求余后再赋值
<<=
左移后赋值
>>=
右移后赋值
&=
按位与后赋值
|=
按位或后赋值
^=
按位异或后赋值
面试题:有两个int型变量a和b,要求不能使用中间变量,交换它们的值
package main
import"fmt"funcmain(){var a =8var b =2
fmt.Printf("交换前:a=%v,b=%v\n", a, b)
a = a + b // 执行后a的值为它们的和
b = a - b // 执行后b的值为之前a的值
a = a - b // 执行后a的值为之前b的值
fmt.Printf("交换后:a=%v,b=%v\n", a, b)}/*结果:
交换前:a=8,b=2
交换后:a=2,b=8
*/