运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等。
算术运算符、赋值运算符、比较运算符/关系运算符、逻辑运算符、位运算符等。
一、算术运算符
算术运算符是对数值类型的变量进行运算的,比如:加减乘除。在Go程序中使用的非常多。
运算符 | 运算 | 范例 | 结果 |
+ | 正号 | +3 | 3 |
- | 负号 | -4 | -4 |
+ | 加 | 5+5 | 10 |
- | 减 | 6-3 | 3 |
* | 乘 | 4*5 | 20 |
/ | 除 | 6/3 | 2 |
% | 取模(取余) | 7%5 | 2 |
++ | 自增 | a=2 a++ | a=3 |
-- | 自减 | a=2 a-- | a=1 |
+ | 字符串相加 | "he"+"llo" | "hello" |
package main import "fmt" func main() { //1.运算符/的使用 //如果运算的数都是整数,那么除后得到的结果是去掉小数部分保留整数部分 fmt.Println(10 / 4) //如果希望保留小数部分,则需要有浮点数参与运算 var n float32 = 10.0 / 4 fmt.Println(n) //2.运算符%的使用,公式:a%b=a-a/b*b fmt.Println("10%3 = ", 10%3) //10%3=1 fmt.Println("-10%3 = ", -10%3) //-10%3=-1 fmt.Println("10%-3 = ", 10%-3) //10%-3=1 fmt.Println("-10%-3 = ", -10%-3) //-10%-3=-1 //3.++和--的使用 var i int = 10 i++ fmt.Println("i = ", i) i-- fmt.Println("i = ", i) }
算术运算符使用的注意事项
(1)、对于除号 "/",它的整数除和小数除是有区别的:整数之间做除法时,只保留整数部分而舍弃小数部分。 例如: x := 19/5 ,结果是3
(2)、当对一个数取模时,可以等价a%b=a-a/b*b
(3)、Golang的自增自减只能当做一个独立语言使用
(4)、Golang的++和--只能写在变量的后面,不能写在变量的前面,即:只有a++和a--,没有++a和--a
(5)、Golang的设计者去掉c/java中的自增自减的容易混淆的写法,让Golang更加简洁,统一。(强制性的)
练习:
1、假如还有97天放假,问:xx个星期零xx天?
2、定义一个变量保存华氏温度,华氏温度转换摄氏温度的公式为:5/9*(华氏温度-100),请求出华氏温度对应的摄氏温度?
package main import "fmt" func main() { //1、假如还有97天放假,问:xx个星期零xx天? var days int = 97 var week int = days / 7 var day int = days % 7 fmt.Printf("%d个星期零%d天 ", week, day) //2、定义一个变量保存华氏温度,华氏温度转换摄氏温度的公式为:5/9*(华氏温度-100),请求出华氏温度对应的摄氏温度? var huashi float32 = 134.2 var sheshi float32 = 5.0 / 9 * (huashi - 100) fmt.Printf("%v 对应的摄氏温度 = %v ", huashi, sheshi) }
二、关系运算符(比较运算符)
关系运算符的结果都是bool型,也就是要么是true,要么是false。
关系表达式经常用在if结构的条件中或循环结构的条件中。
运算符 | 运算 | 范例 | 结果 |
== | 等于 | 4==3 | false |
!= | 不等于 | 4!=3 | true |
< | 小于 | 3<4 | true |
> | 大于 | 4>1 | true |
<= | 小于等于 | 5<=3 | false |
>= | 大于等于 | 4>=2 | true |
关系运算符的细节说明:
(1)、关系运算符的结果都是bool型,也就是要么是true,要么是false。
(2)、关系运算符组成的表达式称为关系表达式: a > b
(3)、比较运算符"=="不能误写成"="
三、逻辑运算符
用于连接多个条件(一般来讲就是关系表达式),最终的结果是一个bool值。
1、逻辑运算符的使用说明
假定A值为true,B值为false
运算符 | 描述 | 实例 |
&& | 逻辑与运算符。如果两边的操作数都是true,则为true,否则为false | (A&&B)为false |
|| | 逻辑或运算符。如果两边的操作数有一个为true,则为true,否则为false | (A||B)为true |
! | 逻辑非运算符。如果条件为true,则逻辑为false,否则为true | !(A&&B)为true |
package main import "fmt" func main() { //1、逻辑运算符&&的使用 var age int = 40 if age > 30 && age < 50 { fmt.Println("ok1") } //2、逻辑运算符||的使用 if age > 30 || age < 50 { fmt.Println("ok2") } //3、逻辑运算符!的使用 if age > 30 { fmt.Println("ok3") } if !(age > 30) { fmt.Println("ok4") } }
2、逻辑运算符使用说明
(1)、&&也叫短路与:如果第一个条件为false,则第二个条件不会判断,最终结果为false
(2)、||也叫短路或:如果第一个条件为true,则第二个条件不会判断,最终结果为true
package main import "fmt" func test() bool { fmt.Println("test......") return true } func main() { var i int = 10 //1、短路与&& //因为i<9为false,所以后面的test()不执行 if i < 9 && test() { fmt.Println("ok") } //2、短路或|| //因为i>9为true,所以后面的test()不执行 if i > 9 || test() { fmt.Println("yes") } }
四、赋值运算符
赋值运算符就是将某个运算后的值,赋给指定的变量。
运算符 | 描述 | 实例 |
= | 简单的赋值运算符,将一个表达式的值赋给一个左值 | c=a+b将a+b表达式结果赋值给c |
+= | 相加后再赋值 | c+=a等于c=c+a |
-= | 相减后再赋值 | c-=a等于c=c-a |
*= | 相乘后再赋值 | c*=a等于c=a*c |
/= | 相除后再赋值 | c/=a等于c=c/a |
%= | 求余后再赋值 | c%=a等于c=c%a |
<<= | 左移后赋值 | c<<=2等于c=c<<2 |
>>= | 右移后赋值 | c2>>=等于c=c>>2 |
&= | 按位与后赋值 | c&=2等于c=c&2 |
^= | 按位异或后赋值 | c^=2等于c=c^2 |
|= | 按位或后赋值 | c|=2等于c=c|2 |
package main import "fmt" func main() { var i int //基本赋值 i = 10 fmt.Println("i = %v", i) //有两个变量,a和b,要求将其进行交换,最终打印结果 a := 9 b := 2 fmt.Printf("交换前的情况是 a = %v ,b = %v ", a, b) t := a a = b b = t fmt.Println("交换后的情况是 a = %v , b = %v ", a, b) //复合赋值的操作 a += 17 fmt.Println("a = %v ", a) }
赋值运算符的特点:
运算顺序从右往左
赋值运算符的左边 只能是变量,右边 可以是变量、表达式、常量值
有两个变量,a 和 b,要求将其进行交换,但是不允许使用中间变量,最终打印结果
package main import "fmt" func main() { //有两个变量,a 和 b,要求将其进行交换,但是不允许使用中间变量,最终打印结果 var a int = 10 var b int = 20 a = a + b b = a - b a = a - b fmt.Printf("a = %v b = %v ", a, b) }
五、位运算符
运算符 | 描述 |
& | 按位与运算符&是双目运算符。其功能是参与运算的两个数各对应的二进位相与。运算规则是:同时为1,结果为1,否则为0。 |
| | 按位或运算符|是双目运算符。其功能是参与运算的两个数各对应的二进位相或。运算规则是:有一个为1,结果为1,否则为0。 |
^ | 按位异或运算符^是双目运算符。其功能是参与运算的两个数各对应的二进位相异或。运算规则是:当二进位不同时结果为1,否则为0。 |
<< | 左移运算符<<是双目运算符。其功能是把<<左边的运算数的各二进位全部左移若干位,高位丢弃,低位补0。左移n位就是乘以2的n次方。 |
>> | 右移运算符>>是双目运算符。其功能是把>>左边的运算数的各二进位全部右移若干位,右移n位就是除以2的n次方。 |
六、其它运算符
运算符 | 描述 | 实例 |
& | 返回变量存储地址 | &a 给出变量的实际地址 |
* | 指针变量 | *a 是一个指针变量 |
package main import "fmt" func main() { a := 100 fmt.Println("a的地址是", &a) var ptr *int = &a fmt.Println("ptr指向的值是", *ptr) //求两个数的最大值 var n1 int = 10 var n2 int = 40 var max int if n1 > n2 { max = n1 } else { max = n2 } fmt.Println("max = ", max) }
go语言不支持三元运算符。
go的设计理念是一种事情有且只有一种方法完成。
七、运算符的优先级
运算符有不同的优先级,所谓优先级就是表达式运算中的运算顺序。
只有单目运算符、赋值运算符是从右向左运算的。
八、键盘输入语句
func Scan(a ...interface{}) (n int, err error)
Scan从标准输入扫描文本,将成功读取的空白分隔的值保存进成功传递给本函数的参数。换行视为空白。返回成功扫描的条目个数和遇到的任何错误。如果读取的条目比提供的参数少,会返回一个错误报告原因。
func Scanln(a ...interface{}) (n int, err error)
Scanln类似Scan,但会在换行时才停止扫描。最后一个条目后必须有换行或者到达结束位置。
func Scanf(format string, a ...interface{}) (n int, err error)
Scanf从标准输入扫描文本,根据format 参数指定的格式将成功读取的空白分隔的值保存进成功传递给本函数的参数。返回成功扫描的条目个数和遇到的任何错误。
package main import "fmt" func main() { //从控制台接收用户信息,[姓名,年龄,薪水, 是否通过考试]。 var name string var age byte var sal float32 var isPass bool fmt.Println("请输入姓名") fmt.Scanln(&name) fmt.Println("请输入年龄") fmt.Scanln(&age) fmt.Println("请输入薪水") fmt.Scanln(&sal) fmt.Println("请输入是否通过考试") fmt.Scanln(&isPass) fmt.Printf("名字是 %v 年龄是 %v 薪水是 %v 是否通过考试 %v ", name, age, sal, isPass) fmt.Println("请输入你的姓名,年龄,薪水,是否通过考试,使用空格隔开") fmt.Scanf("%s %d %f %t", &name, &age, &sal, &isPass) fmt.Printf("名字是 %v 年龄是 %v 薪水是 %v 是否通过考试 %v ", name, age, sal, isPass) }