视频讲解
视频讲解:资源包\Video\03\3.1运算符.mp4
运算符就是具有运算功能的符号。C++语言中有丰富的运算符,其中很多运算符都是从C语言继承的,它新增的运算符有作用域运算符“::”和成员指针运算符“->”。
与C语言一样,根据使用运算符的对象个数,C++语言将运算符分为单目运算符、双目运算符和三目运算符。根据使用运算符的对象之间的关系,C++语言将运算符分为算术运算符、关系运算符、逻辑运算符、赋值运算符、位运算符、移位运算符、sizeof运算符、条件运算符和逗号运算符。
算术运算主要指常用的加(+)、减(-)、乘(*)、除(/)四则运算,算术运算符中有单目运算符和双目运算符。算术运算符如表3.1所示。
表3.1 算术运算符
说明
expr表示使用运算符的对象,可以是表达式、变量和常量。
在C++语言中有两个特殊的算术运算符,即自增运算符“++”和自减运算符“--”。例如公交车上的乘客数量,每上来一个乘客,乘客的数量就会增加一个,此时乘客的数量就可以使用自增运算符来算,因为自增运算符的作用就是使变量值加1。同样,自减运算符的作用是使变量值减1。例如客车上的座位数量,每上来一个乘客,座位的数量就会减少一个,此时座位的数量就可以使用自减运算符来算。
自增运算符和自减运算符可以被放在变量的前面或者后面,放在变量的前面称为前缀,放在变量的后面称为后缀。自增、自减的形式如图3.1所示。
从图3.1中可以看出,运算符的位置并不重要,因为所得到的结果是一样的,自减就是减1,自增就是加1。
图3.1 自增、自减的形式
注意
在表达式内部,作为运算的一部分,两者的用法可能有所不同。如果将运算符放在变量的前面,那么变量在参与表达式运算之前要先完成自增或者自减的运算;如果将运算符放在变量的后面,那么变量的自增或者自减的运算要在变量参与表达式运算之后完成,如图3.2所示。
图3.2 前缀与后缀比较
常见错误
自增运算符和自减运算符是单目运算符,因此表达式和常量不可以进行自增、自减。例如,5++和(a+5)++都是不合法的。
在数学中,经常需要比较两个数的大小。例如,如图3.3所示,小明的数学成绩是90分,小红的数学成绩是95分,在单科成绩单中,小红的排名高于小明。在比较成绩时,就使用了本节要讲的关系运算符。在C++语言中,关系运算符的作用就是判断两个操作数的大小关系。
图3.3 比较数学成绩示意图
关系运算符如表3.2所示。
表3.2 关系运算符
注意
运算符“>=”与“<=”的意思分别是大于或等于、小于或等于。
关系运算符都是双目运算符,其结合性均为左结合。关系运算符的优先级低于算术运算符,高于赋值运算符。在6个关系运算符中,<、<=、>、>=的优先级相同,高于==和!=的优先级,==和!=的优先级相同。
在招聘信息中常常会看到对年龄的要求,如要求年龄在18岁以上、35岁以下。使用C++语言怎样来表达这句话的意思呢?如图3.4所示。
图3.4 招聘要求的C++语言表达
图3.4中的&&就是逻辑运算符,逻辑运算符是对真和假这两种逻辑值进行运算,运算后的结果仍然是一个逻辑值。逻辑运算符如表3.3所示。
表3.3 逻辑运算符
例如,变量a和b的逻辑运算结果如表3.4所示。
表3.4 变量a和b的逻辑运算结果
续表
说明
1代表真,0代表假。
其中的表达式仍然可以是逻辑表达式,从而形成了嵌套。例如,(a||b)&&c的结合性为逻辑运算符的左结合。
实例位置:资源包\Code\SL\03\01
程序运行结果如图3.5所示。
图3.5 求逻辑表达式的值
拓展训练
(1)有两名男性应聘者,年龄分别为25岁和32岁。该公司招聘信息中有一个要求,即男性应聘者的年龄为23~30岁,判断这两名应聘者是否满足这个要求。 (资源包\Code\Try\009)
(2)在明日学院网站首页中,可以使用账户名登录,也可以使用手机号登录,还可以使用电子邮箱登录。请判断某用户是否可以登录。(已知服务器中有这样的记录——账户名:张三,手机号:1234567890,电子邮箱:zhangsan@163.com)。 (资源包\Code\Try\010)
在程序中经常遇到的符号“=”就是赋值运算符,其作用是将一个数值赋给变量。
赋值运算符分为简单赋值运算符和复合赋值运算符,其中复合赋值运算符又称为带有运算的赋值运算符。简单赋值运算符就是给变量赋值的运算符。例如:
等号“=”就是简单赋值运算符。
C++语言提供了很多复合赋值运算符,如表3.5所示。
表3.5 复合赋值运算符
复合赋值运算符都有等同的简单赋值运算符和其他运算符的组合形式。
☑ a+=b,等价于a=a+b。
☑ a-=b,等价于a=a-b。
☑ a*=b,等价于a=a*b。
☑ a/=b,等价于a=a/b。
☑ a%=b,等价于a=a%b。
☑ a<<=b,等价于a=a<<b。
☑ a>>=b,等价于a=a>>b。
☑ a&=b,等价于a=a&b。
☑ a^=b,等价于a=a^b。
☑ a|=b,等价于a=a|b。
复合赋值运算符都是双目运算符,C++语言采用这种运算符可以更高效地进行加、减、乘、除、移位等运算,编译器在生成目标代码时能够直接优化,使程序代码更精简。这种书写形式也非常简洁,使得代码更加紧凑。
复合赋值运算符将运算结果返回作为表达式的值,同时把第一个操作数对应的变量值设为运算结果。例如:
运算结果是:a=30。a*=5等价于a=a*5,a*5的运算结果被作为临时变量值赋给了变量a。
位运算符有位逻辑与运算符、位逻辑或运算符、位逻辑异或运算符和取反运算符,其中位逻辑与运算符、位逻辑或运算符和位逻辑异或运算符为双目运算符,取反运算符为单目运算符。位运算符如表3.6所示。
表3.6 位运算符
在双目运算符中,位逻辑与运算符的优先级最高,位逻辑或运算符次之,位逻辑异或运算符最低。
(1)位逻辑与,实际上是将操作数转换成二进制表示形式,然后将两个二进制操作数对象从低位(最右边)到高位对齐,每位求与。若两个操作数对象的同一位都为1,则结果的对应位为1;否则,结果的对应位为0。例如,12和8经过位逻辑与运算后得到的结果是8。
说明
十进制数在用二进制形式表示时,有原码、反码、补码多种表示方式。
(2)位逻辑或,实际上是将操作数转换成二进制表示形式,然后将两个二进制操作数对象从低位(最右边)到高位对齐,每位求或。若两个操作数对象的同一位都为0,则结果的对应位为0;否则,结果的对应位为1。例如,4和8经过位逻辑或运算后得到的结果是12。
(3)位逻辑异或,实际上是将操作数转换成二进制表示形式,然后将两个二进制操作数对象从低位(最右边)到高位对齐,每位求异或。若两个操作数对象的同一位不同时为1,则结果的对应位为1;否则,结果的对应位为0。例如,31和22经过位逻辑异或运算后得到的结果是31。
(4)取反,实际上是将操作数转换成二进制表示形式,然后将各个二进制位由1变为0,由0变为1。例如,41883经过取反运算后得到的结果是23652。
位运算符实际上是算术运算符,使用位运算符组成的表达式的值是算术值。
实例位置:资源包\Code\SL\03\02
程序运行结果如图3.6所示。
图3.6 使用位运算符
拓展训练
(1)使用位运算符,将0xFFFF1234最低位的2字节设置为0,结果为0xFFFF0000。 (资源包\Code\Try\011)
(2)用户创建完新账户后,服务器为保护用户隐私,使用异或运算对用户密码进行二次加密,计算公式为“加密数据=原始密码^加密算子”,已知加密算子为整数79。请问用户密码459137经过加密后的值是多少? (资源包\Code\Try\012)
移位运算符有两个,分别是左移运算符“<<”和右移运算符“>>”,这两个运算符都是双目运算符。
(1)左移是指将一个二进制操作数按指定的位数向左移动,左边(高位端)溢出的位被丢弃,右边(低位端)的空位用0填充。左移相当于乘以2的幂,如图3.7所示。
例如,操作数41883的二进制形式是1010 0011 1001 1011,左移1位变成18230,左移2位变成36460,运算过程如图3.8所示(假设该操作数为16位)。
(2)右移是指将一个二进制操作数按指定的位数向右移动,右边(低位端)溢出的位被丢弃,左边(高位端)的空位用0填充,或者用被移位操作数的符号位填充,运算结果与编译器有关。在使用补码的机器中,正数的符号位为0,负数的符号位为1。右移相当于除以2的幂,如图3.9所示。
例如,操作数41883的二进制形式是1010 0011 1001 1011,右移1位变成20941,右移2位变成10470,运算过程如图3.10所示(假设该操作数为16位)。
图3.7 左移运算
图3.8 左移运算过程
图3.9 右移运算
图3.10 右移运算过程
实例位置:资源包\Code\SL\03\03
程序运行结果:
由于移位运算的速度很快,在程序中遇到表达式乘以2的幂或除以2的幂的情况时,一般采用移位运算。
拓展训练
(1)使用移位运算符,计算“1024/8”的结果。 (资源包\Code\Try\013)
(2)使用移位运算符和算术运算符,计算“1024%8”的结果。 (资源包\Code\Try\014)
sizeof运算符是一个很像函数的运算符,也是唯一一个用到字母的运算符。该运算符有两种形式:
其功能是返回指定的数据类型或表达式值的数据类型在内存中占用的字节数。
说明
由于CPU寄存器的位数不同,因此同种数据类型占用的内存字节数就可能不同。
例如:
返回1,说明char类型占用1字节。
返回4,说明void类型的指针占用4字节。
返回4,说明数字66占用4字节。
条件运算符是C++语言中仅有的一个三目运算符,该运算符需要3个操作数对象,形式如下:
“表示式1”是一个逻辑值,可以为真或假。若“表达式1”为真,则运算结果是“表达式2”;若“表达式1”为假,则运算结果是“表达式3”。这个运算相当于一条if语句。
C++语言中的逗号“,”也是一种运算符,称为“逗号运算符”。逗号运算符的优先级最低,结合方向自左至右,其功能是把两个表达式连接起来组成一个表达式。逗号运算符是一个多目运算符,并且操作数的个数不限定,可以将任意多个表达式组成一个表达式。
例如:
逗号表达式的注意事项如下:
(1)逗号表达式可以嵌套。
嵌套的逗号表达式可以被转换成扩展形式,扩展形式如下:
整个逗号表达式的值等于表达式 n 的值。
(2)在程序中使用逗号表达式,通常要分别求出逗号表达式内各表达式的值,并不一定要求出整个逗号表达式的值。
(3)并不是在所有出现逗号的地方都能组成逗号表达式,比如在变量说明中,函数参数表中的逗号只是用作各变量之间的间隔符。