一,操作符
1.算术操作符
常见算术操作符:+ - * / %
除了%操作符,其他几个操作符既适用于浮点型,也适用于整数类型,%操作符两边只能为整数类型
2.移位操作符
<< :左移操作符 >>: 右移操作符 移动的是二进制位
整数的二进制表示有3种:原码,反码,补码
正的整数的原,反,补码相同
负的整数需要计算
下面以7和-7举例
整数在内存中存储的是补码,偏移码就是补码符号位取反
左移操作符:左边丢弃,右边补零
右移操作符:逻辑移位:右边丢弃,左边补零 算术移位:右边丢弃,左边补原符号位
3.位操作符
比较的是二进制位
&(按位与):有0为0,全1得1
|(按位或):有1为1,全0得0
^(按位异或):相同为0,相异为1
4.赋值操作符
=
复合赋值符
+= -= *= /= %=
例:
a+=b 等价于a=a+b
5.单目操作符
!:对它的操作数执行逻辑反操作
~:对整型类型的操作数进行求补操作,原先的1变为0,0变为1
++:前置++,先++,后使用 后置++,先使用,后++
sizeof:计算变量所占内存空间大小,单位是字节;计算类型所创建的变量占据空间的大小
6.逻辑操作符
&&:逻辑与
表达式1 && 表达式2 如果表达式1和2都为真,则整个表达式为真,1个为假则整个为假
||:逻辑或
表达式1 || 表达式2 如果表达式1和2中有一个为真,则整个表达式为真
7.条件操作符
表达式1 ? 表达式2:表达式3
如果表达式1的值为真,则执行表达式2的值,否则执行表达式3的值
8.逗号操作符
用逗号隔开的表达式,从左到右依次执行,整个逗号表达式的值就是最后那个表达式的值
二,表达式求值
(1)隐式类型转换
C的整型算术运算总是至少以缺省整型类型的精度来进行的,为了获得这个精度,表达式中的字符型和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升。
整型提升的规则:无符号位,高位补零。 有符号位,高位补0/1,看符号位。
(2)算术转换
如果进行计算时,两个操作数类型不同,则需要转为同一类型。一般是由低操作符转换为高操作符
(3)操作符的优先级
操作符 | 描述 | 用法示例 | 结合性 |
() | 函数调用 | rexp(rexp,..rexp) | L-R |
[ ] | 下标引用 | rexp[rexp] | L-R |
. | 访问结构体成员 | lexp.member_name | L-R |
-> | 访问结构指针成员 | rexp->member_name | L-R |
++ | 后缀自增 | lexp++ | L-R |
-- | 后缀自减 | lexp-- | L-R |
! | 逻辑反 | ! rexp | R-L |
~ | 按位取反 | ~rexp | R-L |
+ | 单目运算符,正值 | +rexp | R-L |
- | 单目运算符,负值 | -rexp | R-L |
++ | 前缀自增 | ++lexp | R-L |
-- | 前缀自减 | --lexp | R-L |
* | 间接访问 | *rexp | R-L |
& | 取地址 | &lexp | R-L |
sizeof | 长度计算 | sizeof() | R-L |
(类型) | 强制类型转换 | (类型)rexp | R-L |
* | 乘法 | rexp*rexp | L-R |
/ | 除法 | rexp/rexp | L-R |
% | 整数取余 | rexp%rexp | L-R |
+ | 加法 | rexp+rexp | L-R |
- | 减法 | rexp-rexp | L-R |
<< | 左移位 | rexp<<rexp | L-R |
>> | 右移位 | rexp>>rexp | L-R |
> | 大于 | rexp>rexp | L-R |
>= | 大于等于 | rexp>=rexp | L-R |
< | 小于 | rexp<rexp | L-R |
<= | 小于等于 | rexp<=rexp | L-R |
== | 等于 | rexp==rexp | L-R |
!= | 不等于 | rexp!=rexp | L-R |
& | 按位与 | rexp & rexp | L-R |
^ | 按位异或 | rexp ^ rexp | L-R |
| | 按位或 | rexp | rexp | L-R |
&& | 逻辑与 | rexp && rexp | L-R |
|| | 逻辑或 | rexp || rexp | L-R |
? : | 条件操作符 | rexp?rexp:rexp | N/A |
= | 赋值 | lexp = rexp | R-L |
+= | 加后赋值 | lexp+=rexp | R-L |
-= | 减后赋值 | lexp-=rexp | R-L |
*= | 乘后赋值 | lexp*=rexp | R-L |
/= | 除后赋值 | lexp/=rexp | R-L |
%= | 取模后赋值 | lexp%=rexp | R-L |
<<= | 左移后赋值 | lexp<<=rexp | R-L |
>>= | 右移后赋值 | lexp>>=rexp | R-L |
&= | 按位与后赋值 | lexp&=rexp | R-L |
^= | 按位异或后赋值 | lexp^=rexp | R-L |
|= | 按位或后赋值 | lexp|=rexp | R-L |
, | 逗号表达式 | rexp,rexp | L-R |