1.操作符分类
操作符简单来说是执行某种特定功能的符号。
- 算数操作符
- 移位操作符
- 位操作符
- 赋值操作符
- 单目操作符
- 关系操作符
- 逻辑操作符
- 条件操作符
- 逗号表达式
- 下标引用、函数调用和结构成员
2. 算数操作符
+ - * / %
算数操作符是我们最熟悉的操作符,可以用来进行数据运算。
使用方法效果如下图所示:
注:1:%运算的左右操作数,只能是整数!不能为浮点数
3.移位操作符
左移操作符 <<
右移操作符 >>
移位操作数只能为整数,不能移动负数位
计算机存储数据是用补码的方式储存的
3.1 左移操作符
移位规则:左边丢弃,右边补0
如下示例:
原码:人们最熟悉的编码方式,0/1表示正负,数值位为二进制位
反码:除符号位不变,将原码的数值位取反。
补码:反码+1
补充原码和反码互相转化的技巧:符号位不变,从右往左(低位到高位)看,遇到第一个‘1’后,第一个‘1’左边的数值位全部取反。补码转原码同样适用!
3.2 右移操作符
移位规则:分为两种:
- 逻辑移位:右边丢弃,左边补0
- 算数移位:右边丢弃,左边补符号位(正数补0,负数补1)
如下示例:
可以看出VS2019默认算数右移!
4. 位操作符
| 按位或 & 按位与 ^ 按位异或(同0异1)
注:操作数必须为整数
如下示例:
5. 赋值操作符(=)
用=表示赋值,==判断是否相等
复合赋值操作符:
- +=
- -=
- *=
- /=
- %=
- >>=
- <<=
- &=
- |=
- ^=
例如:sum=+i 等价于 sum=sum +i
6.单目运算符
‘ !’为逻辑取反,非0的都为真,0为假
如下示例:
sizeof格式问题:
6.1 sizeof与数组
从这里可以看出(2)(4)传进去的为数组的首地址,并不是整个数组。
7.关系操作符
注:==和=不要用混
8.逻辑操作符
如图代码:&&操作,判断a++先使用后赋值,在判断a为0后,直接可以判断出表达式为假,因此后面的运算都不算了
如图代码:| |操作,只要判断出一边为真,后面的运算也不用算了,a为0,b为3为真,因此d++不再运算!
9.条件操作符
exp1 ? exp2 : exp3
用途:简化代码量
10.逗号表达式
(exp1, exp2, exp3, …expN)
逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果。
从图中可以看出,数组的内容为{1,2,4,5},可以看出(3,4)的结果为4.
11.下标引用、函数调用和结构成员
[ ] 下标引用操作符
( ) 函数调用操作符
结构体访问 (. ->)
12.表达式求值
12.1 隐式类型转换
简单理解为,CPU愿意计算 大于等于int 类型的数据,如果数据类型为char或者short时,系统会默认把char或者short转化为int 类型(按照符号位来补充高位)。
如下例子:
例1:
实例1中的a,b要进行整形提升,但是c不需要整形提升a,b整形提升之后,变成了负数,所以表达式 a0xb6,b0xb600 的结果是假,但是c不发生整形提升,则表达式 c==0xb6000000 的结果是真。
例2:
实例2中的,c只要参与表达式运算,就会发生整形提升,表达式 +c ,就会发生提升,所以 sizeof(+c) 是4个字节。表达式 -c 也会发生整形提升,所以 sizeof(-c) 是4个字节,但是 sizeof© ,就是1个字节。
12.2 算术转换
如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数的转换为另一个操作数的类型,否则操作就无法进行。下面的层次体系称为寻常算术转换。
简单理解就是:不同的类型数据进行计算时,低级的操作数,优先转换为高级的操作数再进行计算。
12.3 操作符属性
- 操作符的优先级
- 操作符的结合性
- 是否控制求值顺序。
最后赋上操作符优先级表格,供大家参考:
以上就是详解操作符的全部内容了,恳请大佬们斧正!💖