5.Go运算符

网友投稿 250 2022-09-24

5.Go运算符

5.Go运算符

前言

在前面的篇章中,我们已经学习了变量,常量,那么接下来我们学习一下运算符。

GO语言中常见的运算符有算术运算符,赋值运算符,关系运算符,逻辑运算符等。

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

下面以a=10 ,b=20为例进行计算

package mainimport "fmt"func main() { var a int = 10 var b int = 20 // 求和 fmt.Printf("a+b=%d\n", a+b) // 减法 fmt.Printf("b-a=%d\n", b-a) // 乘法 fmt.Printf("b*a=%d\n", b*a) // 除法 fmt.Printf("b/a=%d\n", b/a) // 取余 fmt.Println("b%a=", b%a)}

执行如下:

a+b=30b-a=10b*a=200b/a=2b%a= 0

自增与自减操作

package mainimport "fmt"func main() { var a int = 10 var b int = 20 a++ // 自增,GO没有前自增 ++a b-- // 自减,GO没有前自减 --b fmt.Printf("a=%d, b=%d", a, b)}

执行如下:

a=11, b=19

a++等价于a=a+1

注意:GO语言中没有前自增,这是与其它编程语言不同的地方。

(2)演示:某学生三门课成绩为,语文:90  数学:80  英语:67,编程求总分和平均分.

package mainimport "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", sum, avg)}

执行如下:

总分是: 237, 平均分是: 79

虽然已经计算出总分与平均分了,但是我们可以对上面的程序进行优化,怎么优化呢?示例如下:

func main() { var chinese int = 90 // 语文分数 var math int = 80 // 数学分数 var english int = 67 // 英语分数 fmt.Printf("总分是: %d, 平均分是: %d", chinese + math + english, (chinese + math + english)/3)}

以上程序大家需要注意几点:

(2.1)该程序比第一种实现减少了变量的定义,可以减少对内存的占用,所以变量不是定义越多越好。

(2.2) 注意运算优先级:

先乘除,后加减,有括号先算括号里的,相同级别的从左至右运算 int a=((1+5)+3)*2

(2.3) 小括号可以无限制的套用,但一定要成对出现

(3) 类型转换:

现在我们把上面提的需求修改一下:语文:90  数学:80  英语:69,编程求总分和平均分.

只是将英语的成绩进行了修改,还是计算总分和平均分

image-20210421081350888

但是平均分的计算结果还是79分,为什么没有小数呢?

现在将程序进行如下修改:

image-20210421081516019

(4) 思考题:

(4.1)请阅读以下程序,如果该程序正确,请说出程序运行的结果,如果有错误,请说出错误原因,并指明怎样进行修改?

// 思考题一var num1 int = 35var num2 int = 40var avg float64avg = (num1 + num2) / 2fmt.Printf("avg=%f", avg)

(4.2)以下程序,如果正确请说出程序运行的结果,如果错误,请说出错误原因,并指明怎样进行修改?

// 思考题二var num1 int = 10var num2 int = 3var mod float64mod = float64(num1 / num2)fmt.Printf("mod=%.2f", mod)

(4.3)以下程序,如果正确请说出程序运行的结果,如果错误,请说出错误原因,并指明怎样进行修改?

// 思考题三var num1 int = 35var num2 int = 40var num3 int = 2var avg float64avg = float64(num1+num2) / num3fmt.Printf("avg=%f", avg)

(5) 练习:

练习1:定义两个数分别为100和20,打印出两个数的和。

// 练习1:定义两个数分别为100和20,打印出两个数的和。var num1 int = 100var num2 int = 20fmt.Printf("两个数的和: %d", num1 + num2)

运行:

两个数的和:120

练习2:计算半径为5的圆的面积和周长并打印出来.(pi为3.14)面积:pirr; Perimeter(周长)

// 练习2:计算半径为5的圆的面积和周长并打印出来.(pi为3.14)面积:pi*r*r; Perimeter(周长)const PI = 3.14var r float64 = 5.0 // 半径fmt.Printf("面积: %.2f, 周长: %.2f", PI*r*r, PI*2*r)

运行:

面积: 78.50, 周长: 31.40

练习3:某商店T恤(T-shirt)的价格为35元/件,裤子(trousers)的价格为120元/条.小明在该店买了3件T恤和2条裤子,请计算并显示小明应该付多少钱?

打8.8折后呢?

// 练习3:某商店T恤(T-shirt)的价格为35元/件,裤子(trousers)的价格为120元/条.小明在该店买了3件T恤和2条裤子,请计算并显示小明应该付多少钱?var shirt_price int = 35var trousers_price int = 120fmt.Printf("小明在该店买了3件T恤和2条裤子, 应该付: %d\n", shirt_price * 3 + trousers_price *2)fmt.Printf("打8.8折: %.2f", 0.88 * float64(shirt_price * 3 + trousers_price *2))

运行:

小明在该店买了3件T恤和2条裤子, 应该付: 345打8.8折: 303.60

练习4:如上题中打完8.8折后出现小数,商店为了结算方便,只收用户整数部分的钱,如本应收用户303.6,现在只收用户303元,应该如何做?

image-20210421083912216

(6)  强制类型转换总结

强制类型转换的语法格式:

数据类型名(待转换的值)

例如:

var a float64 = 3.123var b intb = int(a)fmt.Printf("b=%d", b)

强制类型转换,数据类型一定要相兼容下面的写法对吗?

var a stringvar b inta = "3.14"b = int(a)fmt.Printf("b=%d", b)

谨记:int 转float强制转换,多小数

float转int强制转换,丢精度.

(7)  补充:关于“+”运算符,除了可以完成两个数字相加以外,也可以链接两个字符串,如下:

var str1 string = "abc"var str2 string = "def"fmt.Printf("%s", str1 + str2)

2:赋值运算符

关于赋值运算符前面我们已经使用过多次,赋值运算符 ​​=​​ ,

var num int =9num = num + 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

3:关系运算符

关系运算符我们又称为比较运算符,听到比较这个词,大家想到的就是比较大小,例如:

大象的重量(1500)>老鼠的重量(1)

兔子的寿命(3)>乌龟的寿命(1000)

我的年龄(20)==你的年龄(20)

提问:比大比小的结果是什么?

结果是对或者是错,在GO语言中,怎样表示对于错呢?

关系运算的结果是布尔类型的。

​​bool​​值只有两个

真:true假:false

GO语言中常见的关系运算符如下:

运算符

术语

示例

结果

==

相等于

4 == 3

false

!=

不等于

4 != 3

true

<

小于

4 < 3

false

>

大于

4 > 3

true

<=

小于等于

4 <= 3

false

>=

大于等于

4 >= 1

true

由以上关系运算符链接的表达式我们称为关系表达式。

关系运算符具体使用方式如下:

package mainimport "fmt"func main() { var b bool // 大象的重量(1500)>老鼠的重量(1) b = 1500 > 1 fmt.Printf("大象的重量(1500)>老鼠的重量(1) 结果为: %t\n", b) // 兔子的寿命(3)>乌龟的寿命(1000) b = 3 > 1000 fmt.Printf("兔子的寿命(3)>乌龟的寿命(1000) 结果为: %t\n", b) // 我的年龄(20)==你的年龄(20) b = 20 == 20 fmt.Printf("我的年龄(20)==你的年龄(20) 结果为: %t\n", b)}

执行如下:

大象的重量(1500)>老鼠的重量(1) 结果为: true兔子的寿命(3)>乌龟的寿命(1000) 结果为: false我的年龄(20)==你的年龄(20) 结果为: true

4:逻辑运算符

(1)常见的逻辑运算符如下:

运算符

术语

示例

结果

!


!a

如果a为假,则!a为真;如果a为真,则!a为假。

&&


a && b

如果a和b都为真,则结果为真,否则为假。

||


a || b

如果a和b有一个为真,则结果为真,二者都为假时,结果为假。

有逻辑运算符连接的表达式叫做逻辑表达式

通过以上表格我们发现:逻辑表达式的结果同样也是bool类型

逻辑运算符两边放的一般都是关系表达式或者bool类型的值。

例如:

5>3 &&true

3>5||false

(2) 案例演示:

让用户输入老王的语文和数学成绩,输出以下判断是否正确,正确输出True,错误输出False

2.1) 老王的语文和数学成绩都大于90分

2.2) 语文和数学有一门是大于90分的

package mainimport "fmt"func main() { // 让用户输入老王的语文和数学成绩,输出以下判断是否正确,正确输出True,错误输出False var chinese, mathematics float64 fmt.Println("输入老王的语文成绩:") fmt.Scan(&chinese) fmt.Println("输入老王的数学成绩:") fmt.Scan(&mathematics) //2.1) 老王的语文和数学成绩都大于90分 if chinese > 90 && mathematics > 90 { fmt.Println("老王的语文和数学成绩都大于90分") } //2.2) 语文和数学有一门是大于90分的 if chinese > 90 || mathematics > 90 { println("语文和数学有一门是大于90分的") }}

执行如下:

image-20210422002732306

(3) 总结:

(3.1)逻辑与 &&

表达式1&&表达式2

表达式1

表达式2

表达式1&&表达式2

True

True

True

False

True

False

True

False

False

False

False

false

(3.2)逻辑或 ||

表达式1||表达式2

表达式1

表达式2

表达式1||表达式2

True

True

True

True

False

True

False

True

True

False

False

false

(3.3)逻辑非 !

!表达式

表达式

!表达式

True

False

False

true

5:其他运算符

运算符

术语

示例

说明

&

取地址运算符

&a

变量a的地址

*

取值运算符

*a

指针变量a所指向内存的值

关于指针的应用,我们后面会重点给大家讲解,目前大家只需要掌握&

6:运算符优先级

(1)上面我们已经将运算符介绍完了,下面说一下它们的运算符优先级。

在Go语言中,一元运算符(一些只需要一个操作数的运算符称为一元运算符(或单目运算符)。)拥有最高的优先级,二元运算符的运算方向均是从左至右。

下表列出了所有运算符以及它们的优先级,由上至下代表优先级由高到低:

如下图所示:

优先级

运算符

7

^   !

6

*    /  %   << >>  &&  ^

5

+   -   |   ^

4

==  !=  < <=  >=  >

3

<-

2

&&

1

||

上图中部分运算符现在没有讲解到,后期用到时再给大家具体讲解,目前大家需要掌握的是算术,赋值,关系,逻辑,取地址运算符。

(2)案例练习: 判断年份是否为闰年?

写下判断闰年的表达式,设待判断的年份变量为year.

闰年的判定(符合下面两个条件之一):

年份能够被400整除.(2000)年份能够被4整除但不能被100整除.(2008)

让用户输入一个年份,如果是润年,则输出true,如果不是,则输出false.

2100/1600/1800/2009年是闰年吗?

package mainimport "fmt"func main() { /** 写下判断闰年的表达式,设待判断的年份变量为year. 闰年的判定(符合下面两个条件之一): - 年份能够被400整除.(2000) - 年份能够被4整除但不能被100整除.(2008) 让用户输入一个年份,如果是润年,则输出true,如果不是,则输出false. */ var year int fmt.Println("请输入年份:") fmt.Scan(&year) if year%400 == 0 || (year%4 == 0 && year%100 != 0) { fmt.Printf("当前年份%d是闰年", year) } else { fmt.Printf("当前年份%d不是闰年", year) }}

执行如下:

image-20210422003734399

image-20210422003719092

注意:逻辑与的优先级要高于逻辑或。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:张静初:如果有天我不演戏了,会是再正常不过的事!
下一篇:23.Go面向对象-接口继承与转换
相关文章

 发表评论

暂时没有评论,来抢沙发吧~