(1)算术操作符:+ - * / %
- 除了%操作符之外,其他的几个操作符可以作用于整数和浮点数。
- 对于/操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。
- %操作符的两个操作数必须为整数。返回的是整除之后的余数。
(2)移位操作符:
<< //左移操作符
>> //右移操作符
- 左移操作符 移位规则:
左边抛弃、右边补0 - 首先右移运算分两种:
逻辑移位 左边用0填充,右边丢弃
算术移位 左边用原该值的符号位填充,右边丢弃 - 对于移位运算符,不要移动负数位,这个是标准未定义的。如:
num>>-1;
(3)位操作符:
`& //按位与
| //按位或
^ //按位异或`
- 他们的操作数必须是整数。
(4)赋值操作符:
复合赋值操作符:
+=
*=
/=
%=
>>=
<<=
&=
|=
^=
这些运算符都可以写成复合的效果。
(5)单目操作符:
! 逻辑反操作
- 负值
+ 正值
& 取地址
sizeof 操作数的类型长度(以字节为单位)
~ 对一个数的二进制按位取反
-- 前置、后置--
++ 前置、后置++
* 间接访问操作符(解引用操作符) (类型) 强制类型转换
(6)关系操作符:
>
>=
<
<=
!= 用于测试“不相等”
== 用于测试“相等
(7)逻辑操作符:
&& 逻辑与
|| 逻辑或
(8)条件操作符:
exp1 ? exp2 : exp3
exp1成立执行exp2;否则执行exp3。
(9)逗号表达式:
exp1, exp2, exp3, …expN
逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达
式的结果。
(10)下标引用、函数调用和结构成员:
[]
()
.
(11)操作符的属性:
复杂表达式的求值有三个影响的因素。
- 操作符的优先级
- 操作符的结合性
- 是否控制求值顺序。
两个相邻的操作符先执行哪个?取决于他们的优先级。如果两者的优先级相同,取决于他们的结合性。
优先级从高到低的操作符表:
() 聚组
() 函数调用
[ ] 下标引用
. 访问结构成员
-> 访问结构指针成
++ 后缀自增
-- 后缀自减
! 逻辑反
~ 按位取反
+ 单目,表示正值
- 单目,表示负值
++ 前缀自增
-- 前缀自减
* 间接访问
& 取地址
sizeof 取其长度,以字示(类型) 类型转换
* 乘法
/ 除法
% 整数取余
+ 加法
- 减法
<< 左移位
>> 右移位
> 大于
>= 大于等于
< 小于
<= 小于等于
== 等于
!= 不等于
& 位与
^ 位异或
| 位或
&& 逻辑与
|| 逻辑或
?: 条件操作符
= 赋值
+= 以...加
-= 以...减
*= 以...乘
/= 以...除
%= 以...取模
<<= 以...左移
>>= 以...右移
&= 以...与
^= 以...异或
|= 以...或
, 逗号
(12)隐式类型转换:
C的整型算术运算总是至少以缺省整型类型的精度来进行的。
为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升。
//实例1
char a,b,c;
a = b + c;
- b和c的值被提升为普通整型,然后再执行加法运算。加法运算完成之后,结果将被截断,然后再存储于a中。
- 整形提升是按照变量的数据类型的符号位来提升的。正数补0,负数补1。无符号数整形提升时高位补零。