2021/9/25 基本运算符(C++)
基本运算符(C++)
一、赋值运算符
1、基本赋值运算符
=
将 “ = ” 右边 值 / 表达式值 赋予左边变量。
2、复合赋值运算符
+=、-=、/=、*=、%=、<<=、>>=、&=、^=、|=
将运算符左边变量与右边 值 / 表达式值 进行相应运算后再将结果赋给左边变量。
例:a += 3 <==> a = a + 3
a %= 3 <==> a = a % 3
p.s. 常量与表达式一般不能作为运算符左边值(如 3 = a、3 += a不合法)。
二、算术运算符
顾名思义,算数运算符是完成基本算术运算所必须的符号。C++中提供了以下几种算术运算符:
运算符 | 描述 | 实例 (“=”后为结果) |
+ | 对操作数执行加法运算 | 4 + 2 = 6 |
- | 从第一个操作数中减去第二个操作数 | 4 - 2 = 2 |
* | 将操作数相乘 | 4 * 2 = 8 |
/ |
用第一个操作数除以第二个操作数(精度可能丢失) |
8 / 2 = 4 ( 8 / 3 = 2 p.s. 小数部分被丢弃) |
% |
求模(生成第一个操作数除以第二个操作数的余数(操作数需为整数,浮点数会CE)) 若一个操作数为负数,则满足 a % b = a - ( a / b ) * b (实例详见P1017题解) |
8 % 3 = 2 17 % ( - 10 ) = 7 |
p.s. 不同类型操作数进行运算时可能因类型强制转换造成精度丢失。
此外,还有递增、递减运算符。
运算符(示例) | 含义 |
a++ | (后缀版本) 使用当前值计算表达式,然后使a加1 |
++a | (前缀版本) 先使a加1,然后使用新值计算表达式 |
a-- | 同a++ ,最终使a减1 |
--a | 同++a ,先使a减1 |
p.s.不要在同一条语句中对同一个变量多次递增/递减,同一条语句可能因此在不同系统不同环境上产生不同结果。
三、关系运算符
关系运算符用于对值进行比较。对于所有的关系表达式,如果比较结果为真,则表达式值为true(1),否则为false(0)。
操作符 | 含义 |
< | 小于 |
> | 大于 |
<= | 小于等于 |
>= | 大于等于 |
== | 相等 |
!= | 不等 |
p.s.请勿混淆关系运算符 “ == ” 与赋值运算符 “ = ” ,如使用错误编译不会报错,这是新手主要的bug来源。错误防范:将表达式 a == 3 写为 3 == a ,如此一来混淆时编译会报错( 3 = a 不合法)。
四、逻辑运算符
c++中提供4种逻辑运算符来组合、修改已有表达式从而判断表达式是否为真。
1、逻辑OR运算符:|| or
如果两侧表达式中任意一个或全部为true时,则得到的表达式的值为true。由于||的优先级较低,所以不需要对左右两侧表达式使用括号。
表达式1:true | 表达式1:false | |
表达式2:true | 结果:true | 结果:true |
表达式2:false | 结果:true | 结果:false |
p.s. “ 假假或假 ” 只有 false || false 值为 false
2、逻辑AND运算符: && and
仅当两侧表达式全部为true时,得到的表达式的值才为true。由于&&的优先级较低,所以不需要对左右两侧表达式使用括号。
表达式1:true | 表达式1:false | |
表达式2:true | 结果:true | 结果:false |
表达式2:false | 结果:false | 结果:false |
p.s. “ 真真与真 ” 只有 true && true 值为 true
3、逻辑NOT运算符:! not
!运算符将它后面的表达式真值取反。
表达式 | 结果 |
true | false |
false | true |
4、其他细节
1、 && 与 || 运算符优先级低于关系运算符
2、 && 运算符优先级高于 || 运算符
3、可使用( )来提高逻辑运算符优先级
4、C++中支持直接使用and、or、not作为运算符使用。C中则需要包含头文件iso646.h
五、位运算符
1、逻辑按位运算符
1、按位与AND:& bitand
按每一个二进制位对两数进行与运算。
2、按位或OR:| bitor
按每一个二进制位对两数进行或运算。
3、按位异或XOR:^ xor
按每一个二进制位对两数进行异或运算。若两值对应位都为0或1,则结果对应位为0。若两值对应位只有一个为1,则结果对应位为1。
b1=1 | b1=0 | |
b2=1 | 0 | 1 |
b2=0 | 1 | 0 |
4、按位非:! compl
按每一个二进制位对一个数进行非运算。将每一位的0转换为1,将1转换为0。
2、移位运算符
1、左移运算符:<<
左移运算符将一数全部二进制位左移,新腾出的位用0补全。
e.g. (dec) 5 ==> (bin) 101
(dec) 5 << 1 ==> (bin) 101X(新腾出一位) ==> (bin) 1010(自动补0)==> (dec) 10
p.s. <<运算符在某种意义上等同于操作 “ a*=2 ” 。由于位运算速度优于乘法运算,有时可以用于某些程序的优化(线段树)。
2.右移运算符:>>
右移运算符将一数全部二进制位右移,超出边界的位直接丢弃。
e.g. (dec) 5 ==> (bin) 101
(dec) 5 >>1 ==> (bin) 10|1 (一位超出边界)==> (bin) 10 (超出边界丢弃) ==> (dec) 2
p.s. >>运算符在某种意义上等同于操作 “ a/=2 ” 。
注意:左移与右移运算符和输入输出中的 << 操作符、>> 操作符不同。
六、条件运算符(三目运算符)
条件运算符 ? : 常被用来代替if else 语句
语法: exp1 ? exp2 : exp3
如果exp1值为真,则整个表达式的值为 exp2 ,若exp1值为假,则整个表达式的值为 exp3 。
七、逗号运算符
逗号运算符用于连接两个表达式,允许将连接后的两表达式放到C++语法只允许放一个表达式的地方
e.g. ++ j , ++ i ; <==> ++ j ; ++ i ;
注意:逗号不总是逗号运算符。如 int i , j ; 中 “ ," 用于分隔两个声明的变量,不起逗号运算符的作用。
八、其他运算符
1、sizeof运算符
sizeof是一个用来获取数据类型、变量的字节大小
e.g. x = sizeof (int) ; ==> x = 4
int x , y ;
y = sizeof x ; ==> y = 4
p.s. sizeof运算符不能求得void类型字节大小(编译错误)。若对表达式求sizeof,则返回表达式结果类型的字节大小而不计算表达式,函数同理。
2、成员运算符: . 与 ->
成员运算符:. 用于访问左侧结构体中的右侧元素。
成员运算符:->用于访问左侧指针所指向的结构体中的右侧元素。
3、强制转换运算符: ()
强制转换运算符可以将括号后变量的类型强制转换为括号内的类型
e.g. char c = “ a ” ; 此时( int ) c = 97
4、指针运算符:取地址运算符 &
不同与按位与,指针运算符:& 返回位于其后的变量的地址。
5、指针运算符:间接寻址运算符 *
间接寻址运算符是取地址运算符的补充,* 返回位于以其后变量为地址的变量值;
e.g. int x = 1 ; int y = &x ; int p = *y ; ==> p = 1
6、下标运算符:[ ]
下标运算符允许操作者访问数组中某一单独元素。
e.g. int a[3] = { 0 , 1 , 2 } ; ==> a[0] = 0 , a[1] = 1 , a[2] = 2
7、命名空间限定符: ::
命名空间限定符用于限定命名空间。
e.g.
#include<iostream> using namespace std; int main() { cout<<"hello world"<<endl; return 0; } //也可写成: #include<iostream> int main() { std::cout<<"hello world"<<endl; return 0; }
附:运算符优先级:
2021/9/25上大学第一次写博客XD