1.23 运算符概述
运算符,在数学中常见的加减乘除之类的符号,那么在C++在编程语言中呢,将使用特定的符号或标记对操作数进行操作以生成结果。用算术运算符将运算对象(也称操作数)连接起来的、符合C ++语法规则的式子,称为C ++算术表达式运算对象包括常量、变量、函数返回值等,以下是一些常见的运算符概述:
( 注:a+b,a就是左边的操作数,b就是右边的操作数)
1.算术运算符
- 加法运算符(+):将两个操作数相加,例如
a + b
。 - 减法运算符(-):从左操作数中减去右操作数,例如
a - b
。 - 乘法运算符(*):将两个操作数相乘,例如
a * b
。 - 除法运算符(/):将左操作数除以右操作数,例如
a / b
。 - 取模运算符(%):返回两个操作数相除的余数,例如
a % b
。 - += : a+=b,相当于 a= a+b;
- -= : a-=b,相当于 a= a-b;
- *= : a*=b,相当于 a= a*b; 注意=号右边的看成一个整体,例如a*=2+3; 实际为a=a*(2+3)
- /= : a/=b,相当于 a= a/b;
- %= : a/=b,相当于 a= a%b;
1.1 对于 / 符号
1.取整符号 /
例如:7/2 = 3,7除以2,商为3,余数为1,那取整就是取的商的结果,3 (这里的=是我们数学意义上的=,在计算机里,我们要比较,需要使用比较运算符 ==,双等于号)
2.除法符号 /
例如:7/2.0 == 3.5,此时除数为浮点类型,所以我们的被除数7,使用/符号表示的为除法运算,并且根据浮点数的小数点,保留相应的位数。
1.2 对于取模运算 %
例如:7%2 = 1,7除以2.商为3,余数为2,取模就是取的除不尽的余数,如果除尽的就是0,除不尽的就是拿的是余数,2
1.2.1 产生随机数
这里引用千锋教育网络基础班的资料,解释一下取模的一些用法
2.一些复合运算的案例
这里要考虑优先级,从右往左--------<<<<<<--------依次计算
int a = 3;
a+= a-=a*=a;
根据表达式 `a+= a-=a*=a;`,其运算结果和过程如下:
1. 首先,根据赋值运算符的优先级规则,先执行乘法赋值运算 `a*=a`。
- 乘法赋值运算 `a*=a` 将 `a` 乘以自身的值,结果为 `9`。
- 此时的表达式变为 `a+= a-=9;`。
2. 接着,执行减法赋值运算 `a-=9`。
- 减法赋值运算 `a-=9` 将 `a` 减去 `9` 的值,结果为 `9-9=0`。
- 此时的表达式变为 `a+=0;`。
3. 最后,执行加法赋值运算 `a+=0`。
- 加法赋值运算 `a+=0` 将 `a` 加上 `0` 的值,结果为 `0+(0)=0`。
- 所以最终的赋值结果是 `a` 等于 `0`。
综上所述,根据给定的表达式 `a+= a-=a*=a;` ,其运算结果是 `0`。
程序运行:
2.关系运算符(比较运算符)
- 相等运算符(==):检查两个操作数是否相等,例如
a == b
。 - 不等运算符(!=):检查两个操作数是否不相等,例如
a != b
。 - 大于运算符(>):检查左操作数是否大于右操作数,例如
a > b
。 - 小于运算符(<):检查左操作数是否小于右操作数,例如
a < b
。 - 大于等于运算符(>=):检查左操作数是否大于或等于右操作数,例如
a >= b
。 - 小于等于运算符(<=):检查左操作数是否小于或等于右操作数,例如
a <= b
。
3.逻辑运算符
- 逻辑与运算符(&&):当两个操作数都为真(在代码里面是叫True)时,返回真。如果任一操作数为假(在代码里面是叫False),则返回假,例如
a && b
。 - 逻辑或运算符(||):当任一操作数为真时,返回真。如果两个操作数都为假,则返回假,例如
a || b
。 - 逻辑非运算符(!):将操作数的逻辑值取反,例如
!a
。
4.赋值运算符
- 简单赋值运算符(=):将右操作数的值赋给左操作数,例如
a = b
。 - 复合赋值运算符:例如加法赋值运算符(+=)、减法赋值运算符(-=)、乘法赋值运算符(*=)等。
5.区分什么是单目、双目、三目
如果运算符需要一个运算对象 就叫单目运算符
如果运算符 需要两个运算对象 就叫双目运算符
如果运算符 需要三个运算对象 就叫三目运算符
如果运算符 需要多个运算对象 就叫多目运算符
6. 复合运算符
常见的复合运算符包括:
- 加法赋值运算符(+=):将右操作数的值加到左操作数,并将结果赋给左操作数,例如
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
。
1.23.6 按位“与”以及 按位取反
1.按位“与” &
语法:全1为1 有0为0
特点:和1相与保持不变 和0相与为0
场景: 将指定位 清0
例如:
1100 1010
& 1011 1100
-----------------
1000 1000
注:代码中需要将这样二进制的转成16进制(单片机开发经常使用)
2.按位“或” |
语法:有1为1全0为0
特点:和1或置1,和0或 保持不变(两个只要有一个1就是1,有0不管,原来是啥还是啥)
场景:将指定位 置1
1100 1010
| 1011 1100
-----------------
1111 1110
3.按位取反 “~”
语法:0变1,1变0
例如:
~1011 1101 == 0100 0010
1.23.7 按位“异或”运算符
1.按位异或 ^
语法:相同为0,不同为1
特点:和1异或取反,和0异或保持不变
场景:将指定位发生翻转
例如:
1100 1010
^ 1011 1100
-----------------
0111 1110
1.23.8 左移、右移运算符
1.左移运算符 <<
左移<<:左边丢弃 右边补0
移动的位数 不要超过 自身位的宽度
例如:dataNum = 1011 1101
现在执行 dataNum << 3; 则dataNum == 1110 1000 向左移动3位,右边补0;
例如代码中:int data = 10;10的二进制是1010 (记住转十进制4位,就是8421十进制从左往右)
那么0000 1010 <<2;左移两位变成:0010 1000 =32+8 = 40
2.右移运算符 >>
右移<<:右边丢弃 左边补0(负数补1)
引用千锋教育c++基础班资料笔记中内容
不管是算术右移、还是逻辑右移都是编译器决定,我们使用者是无法确定的。
无符号数:右边丢弃左边补0有符号数:
正数:右边丢弃左边补0
负数:右边丢弃左边补0(逻右移)
负数:右边丢弃 左边补1 (算术右移)
引用千锋教育c++基础班资料笔记中案例
下图就是我自己使用的计算机的右移策略是算术右移;