操作符的分类:
1 算术操作符
2 移位操作符
3 位操作符
4 赋值操作符
5 单目操作符
6 关系操作符
7 逻辑操作符
8 条件操作符
9 逗号表达式
1 算术操作符:+ - * / %
1) 除了%操作符之外,不能用于浮点数。
2)对于/操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。
3) %操作符的两个操作数必须为整数。返回的是整除之后的余数。
2 移位操作符
<< 左移操作符:左边抛弃、右边补0
右移操作符:
首先右移运算分两种:
1)算术移位
左边用符号位填充,右边丢弃
2) 逻辑移位
左边补0,右边丢弃
3 位操作符:& | ^
注:他们的操作数必须是整数。
4 赋值操作符
该操作符 可以修改之前不满意的值,就是你可以给自己重新赋值。
赋值操作符可以连续使用
+= -= *= /= %= >>= <<= &= |= ^=
这些运算符都可以写成复合的效果,这样写更加简洁。
5 单目运算符
! 逻辑反操作
- 负值
- 正值
& 取地址
sizeof 操作数的类型长度(以字节为单位)
~ 对一个数的二进制按位取反
– 前置、后置–
++ 前置、后置++
- 间接访问操作符(解引用操作符)
(类型) 强制类型转换
前置++和–:先自增(自减),再使用
后置++和–:先使用,再自增(自减)
6 关系操作符:> >= < <= != 用于测试“不相等” == 用于测试“相等”
警告:
在编程的过程中== 和=不小心写错,导致的错误
7 逻辑操作符
&& 逻辑与 :左边表达式为假,不再执行后边的表达式
|| 逻辑或 :左边表达式为真,不再执行后边的表达式
区分逻辑与&&和按位与&
区分逻辑或||和按位或|
1&2----->0
1&&2---->1
1|2----->3
1&&2---->1
8 条件操作符
exp1 ? exp2 : exp3
可以使用条件表达式实现找两个数中较大值,比if else语句简洁明了
9 逗号表达式
exp1, exp2, exp3, …expN
逗号表达式,就是用逗号隔开的多个表达式。
逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果。
算术转换
如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数的转换为另一个操作数的类型,否则操作就无法进行。下面的层次体系称为寻常算术转换。
long double
double
float
unsigned long int
long int
unsigned int
int
如果某个操作数的类型在上面这个列表中排名较低,那么首先要转换为另外一个操作数的类型后执行运算。
警告:但是算术转换要合理,要不然会有一些潜在的问题。
操作符的属性
复杂表达式的求值有三个影响的因素。
- 操作符的优先级
- 操作符的结合性
- 是否控制求值顺序。
两个相邻的操作符先执行哪个?取决于他们的优先级。如果两者的优先级相同,取决于他们的结合性。
表达式的求值部分由操作符的优先级决定。
eg1: ab + cd + e*f
注释:代码1在计算的时候,由于比+的优先级高,只能保证,的计算是比+早,但是优先级并不能决定第三个比第一个+早执行。
所以表达式的计算机顺序就可能是:ab cd ab + cd ef ab + cd + ef
或者:ab cd ef ab + cd ab + cd + e*f
eg2: c + --c;
注释:同上,操作符的优先级只能决定自减–的运算在+的运算的前面,但是我们并没有办法得知,+操作符的左操作数的获取在右操作数之前还是之后求值,所以结果是不可预测的,是有歧义的。