7,运算符
在前面的课程中,我们已经学习了变量,常量,那么接下来我们学习一下运算符。GO语言中常见的运算符有算术运算符,赋值运算符,关系运算符,逻辑运算符等。
7.1 算术运算符
7.1.1
运算符 | 术语 | 示例 | 结果 |
---|---|---|---|
+ | 加 | 10+5 | 15 |
- | 减 | 10-5 | 5 |
* | 乘 | 10*5 | 50 |
/ | 除 | 10/5 | 2 |
% | 取模(取余) | 10%3 | 1 |
++ | 后自增,没有前自增 | a=0;a++ | a=1 |
-- | 后自减,没有前自减 | a=2;a-- | a=1 |
算术表达式:由算术运算符连接起来的式子.如:1+1 a-b(变量ab前面已声明并赋初值)
下面以a=21 ,b=10为例进行计算:
package main
import "fmt"
func main() {
var a int = 21
var b int = 10
var c int
c = a + b
fmt.Printf("第一行 - c 的值为 %d\n", c )
c = a - b
fmt.Printf("第二行 - c 的值为 %d\n", c )
c = a * b
fmt.Printf("第三行 - c 的值为 %d\n", c )
c = a / b
fmt.Printf("第四行 - c 的值为 %d\n", c )
c = a % b
fmt.Printf("第五行 - c 的值为 %d\n", c )
a++
fmt.Printf("第六行 - a 的值为 %d\n", a )
a=21 // 为了方便测试,a 这里重新赋值为 21
a--
fmt.Printf("第七行 - a 的值为 %d\n", a )
}
输出结果如下:
第一行 - c 的值为 31
第二行 - c 的值为 11
第三行 - c 的值为 210
第四行 - c 的值为 2
第五行 - c 的值为 1
第六行 - a 的值为 22
第七行 - a 的值为 20
- a++ 等价于a=a+1
- 注意:GO语言中没有前自增,这是与其他编程语言不同的地方
7.1.2 演示:某学生三门课成绩为,语文:90 数学:80 英语:67,编程求总分和平均分
package main
import (
"fmt"
)
func main() {
var chinese int = 90
var math int = 80
var english int = 67
var sum,avg int
//求总分
sum = chinese + math + english
//求平均分
avg = sum / 3
fmt.Printf("总分是:%d 平均分是:%d\n",sum,avg)
}
输出结果如下:
总分是:237 平均分是:79
虽然已经计算出总分与平均分了,但是我们可以对上面的程序进行优化,怎么优化呢?示例如下:
package main
import (
"fmt"
)
func main() {
var chinese int = 90
var math int = 80
var english int = 67
fmt.Printf("总分是:%d 平均分是:%d\n",chinese+math+english,(chinese+math+english)/3)
}
以上程序大家需要注意几点:
- 该程序比第一种实现减少了变量的定义,可以减少对内存的占用,所以变量不是定义越多越好。
- 注意运算优先级:先乘除,后加减,有括号先算括号里的,相同级别的从左至右运算 int a=((1+5)+3)*2
- 小括号可以无限制的套用,但一定要成对出现
7.1.3 类型转换
现在我们把上面提的需求修改一下:语文:90 数学:80 英语:69,编程求总分和平均分. 只是将英语的成绩进行了修改,还是计算总分和平均分
package main
import (
"fmt"
)
func main() {
var chinese int = 90
var math int = 80
var english int = 69
fmt.Printf("总分是:%d 平均分是:%d\n",chinese+math+english,(chinese+math+english)/3)
}
输出结果如下:
总分是:239 平均分是:79 ## 数字改变了,但没有小数
现将程序进行如下更改:
package main
import (
"fmt"
)
func main() {
var chinese int = 90
var math int = 80
var english int = 69
fmt.Printf("总分是:%d 平均分是:%f",chinese+math+english,float64(chinese+math+english)/3)
}
输出结果如下:
总分是:239 平均分是:79.666667
- Go语言中不允许隐式转换,所有类型转换必须显式声明(强制转换),而且转换只能发生在两种相互兼容的类型之间
7.2 思考题
7.2.1 请阅读以下程序,如果该程序正确,请说出程序运行的结果,如果有错误,请说出错误原因,并指明怎样进行修改?
package main
import (
"fmt"
)
func main() {
var num1 int = 35
var num2 int = 40
var avg float64
avg = (num1+num2) / 2
fmt.Printf("avg=%f",avg)
}
- 所有的类型转换都必须要声明,所以avg=必须要声明格式,修改如下:
package main
import (
"fmt"
)
func main() {
var num1 int = 35
var num2 int = 40
var avg float64
avg = float64((num1+num2) / 2)
fmt.Printf("avg=%f",avg)
}
输出:
avg=37.000000
7.2.2 以下程序,如果正确请说出程序运行的结果,如果错误,请说出错误原因,并指明怎样进行修改?
package main
import (
"fmt"
)
func main() {
var num1 int = 10
var num2 int = 3
var mod float64
mod = float64(num1 / num2)
fmt.Printf("mod=%f",mod)
}
输出如下:
mod=3.000000
- 由于num1和num2声明了为int形式,所以输出结果为取整数;如果要以小数输出,需要提前定义num1和num2的数据形式:
package main
import (
"fmt"
)
func main() {
var num1 float64 = 10
var num2 float64 = 3
var mod float64
mod = float64(num1 / num2)
fmt.Printf("mod=%f",mod)
}
输出结果如下:
mod=3.333333
7.2.3 以下程序,如果正确请说出程序运行的结果,如果错误,请说出错误原因,并指明怎样进行修改?
package main
import (
"fmt"
)
func main() {
var num1 int = 35
var num2 int = 40
var num3 int = 2
var avg float64
avg = float64(num1+num2) / num3
fmt.Printf("avg=%f",avg)
}
- avg已经定义过类型为float64,如果保留小数,需要做如下修改:
package main
import (
"fmt"
)
func main() {
var num1 float64 = 35
var num2 float64 = 40
var num3 float64 = 2
var avg float64
avg = float64((num1+num2) / num3)
fmt.Printf("avg=%f",avg)
}
输出如下:
avg=37.500000
7.3 练习
7.3.1 练习1:定义两个数分别为100和20,打印出两个数的和。
package main
import (
"fmt"
)
func main() {
var a int = 100
var b int = 20
var sum int
sum = a + b
fmt.Printf("sum=%d",sum)
}
输出结果:
sum=120
7.3.2 练习2:计算半径为5的圆的面积和周长并打印出来.(pi为3.14)面积:pirr; Perimeter(周长)
package main
import (
"fmt"
)
func main() {
const pi=3.14
var r float32 = 5
var l float32
l = pi*r*r
fmt.Printf("l=%f",l)
}
输出结果如下:
l=78.500000
7.3.3 某商店T恤(T-shirt)的价格为35元/件,裤子(trousers)的价格为120元/条.小明在该店买了3件T恤和2条裤子,请计算并显示小明应该付多少钱?
package main
import "fmt"
func main() {
var T_shirt int = 35
var trousers int =120
var totalMoney int
var realMoney float64
//总钱数
totalMoney = 3*T_shirt + 2*trousers
//打折后需要付的总钱数
realMoney=float64(totalMoney)*0.88
fmt.Printf("总钱数为:%d,打折后:%f",totalMoney,realMoney)
}
输出结果如下:
总钱数为:345,打折后:303.600000
7.3.4 练习4:如上题中打完8.8折后出现小数,商店为了结算方便,只收用户整数部分的钱,如本应收用户303.6,现在只收用户303元,应该如何做?
package main
import "fmt"
func main() {
var T_shirt int = 35
var trousers int =120
var totalMoney int
var realMoney float64
//总钱数
totalMoney = 3*T_shirt + 2*trousers
//打折后需要付的总钱数
realMoney=float64(totalMoney)*0.88
fmt.Printf("总钱数为:%d,打折后:%d",totalMoney,int(realMoney))
}
## 打折后:%f修改为%d,realMoney的数据格式修改为int
输出结果如下:
总钱数为:345,打折后:303
7.4 强制类型转换总结
强制类型转换的语法格式:
7.4.1 数据类型名(待转换的值)
例如:
package main
import "fmt"
func main() {
var a float64 = 3.123
var b int
b = int(a)
fmt.Printf("b=%d",b)
}
输出如下:
b=3
7.4.2 强制类型转换,数据类型一定要相兼容下面的写法对吗?
package main
import "fmt"
func main() {
var a string
var b int
a = "3.14"
b = int(a)
fmt.Printf("b=%d",b)
}
##错误,禁止不同类型数据强制转换
谨记:int 转float强制转换,多小数float转int强制转换,丢精度.
7.4.3 补充:关于“+”运算符,除了可以完成两个数字相加以外,也可以链接两个字符串,如下:
package main
import "fmt"
func main() {
var str1 string = "abc"
var str2 string = "def"
fmt.Printf("%s",str1+str2)
}
输出如下:
abcdef
7.4.4 作业:
- 编程实现计算几天(如46天)是几周零几 天?
package main
import "fmt"
func main() {
//计算周数
var day int = 46
var week int
var days int
week = day/7
//计算剩余天数
days = day - week*7
fmt.Printf("周数为:%d 剩余天数为%d",week,days)
}
- 编程实现107653秒是几天几小时几分钟几秒?
package main
import (
"fmt"
)
func main() {
var time int = 107653
var hou int
var min int
var sec int
//计算小时
hou = time/3600
//计算分钟
min = (time-hou*3600)/60
//计算剩余秒数
sec = (time-(hou*3600+min*60))
fmt.Printf("小时为:%d 剩余分钟为%d 剩余秒数为%d",hou,min,sec)
输出为:
小时为:29 剩余分钟为54 剩余秒数为13