C++系统教程:运算符与表达式详解
C++系统教程:运算符与表达式详解
1.逗号运算符
- 逗号运算符“,”用于在单个语句中同时执行多个操作,并返回最后一个表达式的值。
- 逗号运算符的优先级最低,结合方向为自左至右。
逗号表达式又称为顺序求值表达式,一般形式如下:
表达式1,表达式2,…,表达式n
求解过程为:先执行表达式1,再执行表达式2,……,最后执行表达式n,整个逗号表达式的值和类型由表达式n决定。
例如:
x=3*5, x*4
上述逗号表达式中,赋值运算符的优先级别高于逗号运算符,因此会先执行表达式x=35,得出a的值为15;然后执行表达式x4,结果为60。最终,整个逗号表达式的值为60。
- 程序中使用逗号表达式,通常是为了取得各表达式的值,而不是求解整个逗号表达式的值。
- 逗号运算符最大的作用是把多个表达式“串联”起来。
- 逗号运算符常用于for循环语句中。
2.位运算符
位运算的对象只能是整型或字符型数据。
位运算符可对其二进制位进行操作,包括位与“&” 、位或“|” 、位异或“^”和取反“~”4种运算,
在3个双目运算符中, “&”的优先级最高, “|”次之, “~”最低。
2.1.位与运算
需将操作数转换成二进制表示方式,从低位(最右边)到高位对齐,逐位求与。
若两个操作数对象同一位都为1,则结果对应位为1,否则结果对应位为0。
2.2位或运算
位或运算中,需将操作数转换成二进制表示方式,从低位(最右边)到高位对齐,逐位求或。
若两个操作数对象同一位都为0,则结果对应位为0,否则结果对应位为1。
比如,4和8位或运算后得到的结果是12。
2.3.位异或运算
- 位异或运算中,需将操作数转换成二进制表示方式,从低位(最右边)到高位对齐,逐位求异或。
- 若两个操作数对象同一位不相同,则结果对应位为1,否则结果中对应位为0。
- 比如,31和22位异或运算后得到的结果是9。
3.取反运算
取反运算中,先将操作数转换成二进制表示方式,然后将各二进制位1变为0,0变为1。
例如,41883取反运算后得到的结果是23652。
说明:十进制数在用二进制表示时有原码、反码、补码等表示方式。
4.移位运算符
移位运算的对象只能是整型或字符型数据。
移位运算符有两个,分别是左移运算符“<<”和右移运算符“>>” ,它们都是双目运算符。
例如,a<<2表示将变量a的二进制位左移2位,b>>1表示将变量b的二进制位右移1位。
下面以短整型数据(内存中占2个字节,16位)为例,介绍左移运算和右移运算的基础知识。
1.左移运算
指将一个二进制数向左移动指定位数,左边(高位端)溢出的位被丢弃,右边(低位端)的空位用0补充。当数值不存在溢出风险时,左移运算的效果相当于原数值乘以2的幂
当需要移位的数值较大时,会发生数据溢出并被舍去。例如,操作数41883的二进制是1010 0011 1001 1011,左移一位后会变成18230,左移两位后会变成36460
2.右移运算
右移运算,指将一个二进制数向右移动指定的位数,右边(低位端)溢出的位被丢弃,左边(高位端)的空位用0填充,或者用被移位操作数的符号位填充。
运算结果和编译器有关,在使用补码的机器中,正数的符号位为0,负数的符号位为1。当数值不存在溢出风险时,右移位运算的效果相当于原数值除以2的幂。
同样,右移位运算有时也会发生数据溢出。例如,操作数41883的二进制是10100011 1001 1011,右移一位变成20941,右移两位变成10470。
练习1
将0x40左移运算。
#include<iostream>
using namespace std;
int main(){
int a=0x40,b;
b=a<<1; //将a左移一位,将运算结果赋值给b
cout<<b<<endl;
}
由于位运算的速度很快,在程序中遇到表达式乘以或除以2的幂的情况,一般采用位运算来代替。
练习2
输出十六进制的高位和低位。
定义一个长整型变量并赋值,利用位与运算和移位运算,计算这个十六进制的高4位和低4位,具体代码如下:
#include <iostream>
using namespace std;
int main(){
long nWord=0x12345678;
int nBits;
nBits=nWord & 0xFFFF; //与 0xFFFF位与,得到低4位
printf("输出结果\n");
printf("low bits are 0x%x\n",nBits);
nBits=(nWord & 0xFFFF)>>16;
printf("hight bits are 0x%x\n",nBits); //与 0xFFFF位与,得到高4位
}
输出结果
low bits are 0x5678
hight bits are 0x0