问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

C++系统教程:运算符与表达式详解

创作时间:
作者:
@小白创作中心

C++系统教程:运算符与表达式详解

引用
CSDN
1.
https://blog.csdn.net/weixin_46669997/article/details/143966036

1.逗号运算符

  1. 逗号运算符“,”用于在单个语句中同时执行多个操作,并返回最后一个表达式的值。
  2. 逗号运算符的优先级最低,结合方向为自左至右。

逗号表达式又称为顺序求值表达式,一般形式如下:

表达式1,表达式2,…,表达式n  

求解过程为:先执行表达式1,再执行表达式2,……,最后执行表达式n,整个逗号表达式的值和类型由表达式n决定。

例如:

x=3*5, x*4  

上述逗号表达式中,赋值运算符的优先级别高于逗号运算符,因此会先执行表达式x=35,得出a的值为15;然后执行表达式x4,结果为60。最终,整个逗号表达式的值为60。

  1. 程序中使用逗号表达式,通常是为了取得各表达式的值,而不是求解整个逗号表达式的值。
  2. 逗号运算符最大的作用是把多个表达式“串联”起来。
  3. 逗号运算符常用于for循环语句中。

2.位运算符

位运算的对象只能是整型或字符型数据。

位运算符可对其二进制位进行操作,包括位与“&” 、位或“|” 、位异或“^”和取反“~”4种运算,

在3个双目运算符中, “&”的优先级最高, “|”次之, “~”最低。

2.1.位与运算

需将操作数转换成二进制表示方式,从低位(最右边)到高位对齐,逐位求与。

若两个操作数对象同一位都为1,则结果对应位为1,否则结果对应位为0。

2.2位或运算

位或运算中,需将操作数转换成二进制表示方式,从低位(最右边)到高位对齐,逐位求或。

若两个操作数对象同一位都为0,则结果对应位为0,否则结果对应位为1。

比如,4和8位或运算后得到的结果是12。

2.3.位异或运算

  1. 位异或运算中,需将操作数转换成二进制表示方式,从低位(最右边)到高位对齐,逐位求异或。
  2. 若两个操作数对象同一位不相同,则结果对应位为1,否则结果中对应位为0。
  3. 比如,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  
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号