五一假期继续和朋友happy:
2.5 运算符和表达式
运算符是程序设计中重要的构成元素之一,和我们的生活息息相关,如进行数据计算、大小比较、关系判断等,都离不开运算符。运算符可以细分为算术运算符、位运算符、关系运算符、逻辑运算符和其他运算符。由运算符和变量组成的式子,被称为表达式。
2.5.1 算术运算符
算术运算 (Arithmetic Operators)符就是用来处理数学运算的符号,这是最简单、也最常用的符号。例如,算式35 ÷ 5 = 7中,除符号就是运算符,整个式子就是一个表达式。在数字的处理中几乎都会用到算术运算符号,算术运算符可以分为基本运算符、取模运算符和递增或递减运算符等几大类。具体说明如表2-3所示。
表2-3 算术运算符
类型 | 运算符 | 说明 | 举例 |
四则运算符 | + - * / | 加 减 乘 除法 | 10 + 10 = 20 10 – 10 = 0 10 * 10 = 100 10 / 10 = 1 |
取余运算符 | % | 取余 | 10 % 3 = 1 |
递增或递减 | ++ - - | 递增 递减 | a++等效于a = a + 1 a - -等效于a = a - 1 |
1.四则运算符
在Go语言中,四则运算符是使用最广泛的一类运算符,包括加、减、乘、除4种,其运算规则与数学四则运算完全相同。
实例2-7:工资计算器(源码路径:Go-codes\2\money.go)
本范例演示了使用基本四则运算符计算小菜过去一个月在麦当劳兼职工资收入。麦当劳兼职生薪水待遇和小菜上月的出勤情况如下:
- 工作20天,每天3个小时,一个小时15元。
- 请假4天,每天扣除30元。
- 交通补助每天5元,每月按照实际出勤天数计算。
在实例文件money.go中定义了7个整型变量来计算工资收入,代码如下:
package main
import "fmt"
func main(){
var m int = 3 //表示每天3小时
var b int= 15 //表示1小时15元
var a int= 20 //表示工作20天
var l int= 4 //表示请假4天
var c int= 30 //表示每天扣工资30元
var jiao int= 5 * 20 //表示20天的交通补助
var zong int= m * b * a //表示上月的工资总数
fmt.Println("上月工资收入",zong,"元")
fmt.Println("上月交通补助收入:",jiao," 元");
var f int = zong + jiao-l*c; //计算扣除请假后的最终到手收入
fmt.Println("扣除请假后的最终到手收入是:",f," 元");
}
执行后会输出:
上月工资收入 900 元
上月交通补助收入: 100元
扣除请假后的最终到手收入是: 880元
2.求余运算符
在Go程序中,求余运算的功能是使用第一个运算数除以第二个运算数,将得到的余数作为结果。例如,19÷3=6余1,这里的1就是一个余数。通过求余运算符可以得到这个余数。但是需要注意,使用求余运算符的两个运算数不但可以为正,而且还可以为负;不但可以是整型数,而且还可以是浮点数。在使用求余运算符时,计算结果的正负号取决于前面一个数是正数还是负数,不管后面数。例如下面的代码演示了使用求余运算符的用法:
var K int = -49 % -3; //-49 % -3的余数-1
var int Q int = 49 % -3; //49% - 3的余数1
var int J int = -49 %3 ; //-49% - 3的余数-1
3.递增递减运算符
递增递减运算符分别是指“++”和“- -”,每执行一次,变量将会增加1或者减少1,它可以放在变量的前面,也可以放在变量的后面。比如,a = 5,“a++”后,a将变为6。和其它编程语言相比,Go 只支持 i++和i--方式,不支持 ++i和--i方式。
实例2-8:统计本月顾客对员工的好评数据(源码路径:Go-codes\2\money.go)
在实例文件money.g中定义了两个整型变量a和b,然后使用++和- -运算符实现递增和递减处理。代码如下:
package main
import "fmt"
func main(){
var a int =8000 //定义整数类型变量a的初始值是8000
var b int= 4000 //定义整数类型变量b的初始值是4000
fmt.Println("10:00本月小菜的顾客好评点赞数是:")
a++
fmt.Println(a);
fmt.Println("10:01本月小菜的顾客好评点赞数是:")
a++
fmt.Println(a);
fmt.Println("10:00本月同事A的顾客好评点赞数是:")
b--
fmt.Println(b);
fmt.Println("10:01本月同事A的顾客好评点赞数是:")
b--
fmt.Println(b)
}
执行后会输出:
10:00本月小菜的顾客好评点赞数是:
8001
10:01本月小菜的顾客好评点赞数是:
8002
10:00本月同事A的顾客好评点赞数是:
3999
10:01本月同事A的顾客好评点赞数是:
3998
2.5.2 关系运算符
在招聘会上,经常会看到对年龄的要求,例如要求年龄18岁以上,35岁以下,这句话怎么在计算机中用代码表示呢?假设年龄用变量age表示。
18<age<35
这是数学式子。在计算机的世界中,这个功能需要使用关系运算符和逻辑运算符实现。在Java程序设计中,关系运算符是指值与值之间的相互关系,逻辑(logical)运算关系是指可以用真值和假值连接在一起的方法。
在数学运算中有大于或者小于、等于、不等于的关系,在Go程序中,可以使用关系运算符来表示上述关系。假设A的值为 10,B的值为 20,则在表2-4中列出了使用关系运算符计算变量A和变量B的过程。通过这些关系运算符会产生一个结果,这个结果是一个布尔值,即true和false。在Go程序中,任何类型的数据都可以用“==”进行比较是不是相等,用“!=”比较是否不相等,只有数字才能比较大小,关系运算的结果可以直接赋予布尔变量。
表2-4 关系运算符
运算符 | 描述 | 例子 |
== | 检查如果两个操作数的值是否相等,如果相等则条件为真。 | (A == B)为假 |
!= | 检查如果两个操作数的值是否相等,如果值不相等则条件为真。 | (A != B)为真 |
> | 检查左操作数的值是否大于右操作数的值,如果是那么条件为真。 | (A > B)为假 |
< | 检查左操作数的值是否小于右操作数的值,如果是那么条件为真。 | (A < B)为真 |
>= | 检查左操作数的值是否大于或等于右操作数的值,如果是那么条件为真。 | (A > = B)为假 |
<= | 检查左操作数的值是否小于或等于右操作数的值,如果是那么条件为真。 | (A <= B)为真 |
2.5.3 逻辑运算符
逻辑运算符与关系运算符的结果一样,都是Boolean类型的值。布尔逻辑运算符是最常见的逻辑运算符,用于对Boolean型操作数进行布尔逻辑运算。假设A的值为 True,B的值为 False,Go语言逻辑运算符的具体说明如表2-5所示。
表2-5 逻辑运算符
运算符 | 描述 | 实例 |
&& | 逻辑 AND 运算符。 如果两边的操作数都是 True,则条件 True,否则为 False。 | (A && B) 为 False |
|| | 逻辑 OR 运算符。 如果两边的操作数有一个 True,则条件 True,否则为 False。 | (A || B) 为 True |
! | 逻辑 NOT 运算符。 如果条件为 True,则逻辑 NOT 条件 False,否则为 True。 | !(A && B) 为 True |
实例2-9:输出显示“某麦当劳餐厅的本月畅销商品”(源码路径:Go-codes\2\luoji.go)
某麦当劳餐厅规定,某商品的月销量超过30000(包含30000)就是本店的热销商品。假设本月有如下3种商品的销量达到或超过30000:
- 薯条:销量60000。
- 麦乐鸡:销量40000。
- 圣代:30000。
在实例文件luoji.go中定义了3个整型变量a、b和c,分别用于表示3种商品的销量。代码如下:
package main
import "fmt"
func main(){
var a int= 60000 //赋值整数类型变量a的初始值是60000
var b int= 40000 //赋值整数类型变量b的初始值是40000
var c int= 30000 //赋值整数类型变量c的初始值是50000
fmt.Println("市场调查:本月薯条的销量超过5000了吗?");
fmt.Println(a >= 5000);
fmt.Println("市场调查:本月热销量商品包含麦乐鸡吗?");
fmt.Println(b >= 3000);
fmt.Println("市场调查:本月的热销商品包含圣代吗?");
fmt.Println(c >= 3000);
fmt.Println("薯条、麦乐鸡和含圣都是本月的热销商品。");
}
执行后会输出:
市场调查:本月薯条的销量超过5000了吗?
true
市场调查:本月热销量商品包含麦乐鸡吗?
true
市场调查:本月的热销商品包含圣代吗?
true
薯条、麦乐鸡和含圣都是本月的热销商品。
2.5.4 位运算符
在Go程序中,使用位运算符操作二进制数据。位运算(Bitwise Operators)可以直接操作整数类型的位,这些整数类型包括long、int、short、char和byte。假设A为60,B 为13,则Go语言位运算符的具体说明如表2-7所示。
表2-7 位运算符
运算符 | 描述 | 实例 |
& | 按位与运算符"&"是双目运算符。 其功能是参与运算的两数各对应的二进位相与。 | (A & B) 结果为 12, 二进制为 0000 1100 |
| | 按位或运算符"|"是双目运算符。 其功能是参与运算的两数各对应的二进位相或 | (A | B) 结果为 61, 二进制为 0011 1101 |
^ | 按位异或运算符"^"是双目运算符。 其功能是参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。 | (A ^ B) 结果为 49, 二进制为 0011 0001 |
<< | 左移运算符"<<"是双目运算符。左移n位就是乘以2的n次方。 其功能把"<<"左边的运算数的各二进位全部左移若干位,由"<<"右边的数指定移动的位数,高位丢弃,低位补0。 | A << 2 结果为 240 ,二进制为 1111 0000 |
>> | 右移运算符">>"是双目运算符。右移n位就是除以2的n次方。 其功能是把">>"左边的运算数的各二进位全部右移若干位,">>"右边的数指定移动的位数。 | A >> 2 结果为 15 ,二进制为 0000 1111 |
在位运算符中,移位运算符把数字的位向右或向左移动,产生一个新的数字。Go语言的右移运算符有两个,分别是>>和>>>,具体说明如下:
- >>运算符:能够把第一个操作数的二进制码右移指定位数后,左边空出来的位以原来的符号位来填充。即如果第一个操作数原来是正数,则左边补0。如果第一个操作数是负数,则左边补1。
- >>>:能够把第一个操作数的二进制码右移指定位数后,左边空出来的位总是以0来填充。
实例2-10:输出显示“某麦当劳餐厅的本月畅销商品”(源码路径:Go-codes\2\wei.go)
在实例文件wei.go中定义了两个整型变量a和b,然后对a和b实现位运算。代码如下:
package main
import "fmt"
func main(){
var a int = 129; //①
var b int = 128; //②
fmt.Println("xx年麦当劳第四季度营收达",a&b,"亿美元!"); //③
}
- 代码①②分别定义两个int类型的变量a和b,并分别设置他们的初始值。
- 代码③使用println()函数打印输出“a & b”的运算结果。因为a的值是129,转换成二进制就是10000001,而b的值是128,转换成二进制就是10000000。根据与运算符的运算规则,只有两个位都是1时的运算结果才是1,所以“a & b”的运算过程是:
a 10000001
b 10000000
a&b 10000000
由此可以知道,a & b的运算结果是10000000,转换成十进制就是128,所以执行后会输出:
xx年麦当劳第四季度营收达128亿美元!