算数操作符
+ - * / %
注意: 1.% 不能用于浮点数,其他的几个都可以用于整数和浮点数 2.对于/ 操作符如果两个操作数都为整数,执行整数除法。只要有浮点数执行的就是浮点数除法 3.% 两个操作数必须为整数。返回的是整除之后的余数。
移位操作符
<< 左移操作符 >> 右移操作符
左移操作符规则:左边丢弃,右边补0
例子: i<<1 此时i=2^4=16。
右移操作符分2种 1.逻辑移位:左边用0填充,右边丢弃 2.算术移位:左边用原该值的符号位填充,右边丢弃
计算机中存的是补码,正数的原,反,补码都一样。 负数的补码计算: 1.负数的最高位为符号位,符号位不变其他位按位取反得到反码 2.反码在+1得到补码
结论: 算术右移可以进行有符号位的除法,右移n位等于除以2的n次方 注意:不能进行移动负数位。
位操作符
参与运算的数都以补码方式
&:按位与 :只有对应的两个二进位均为1时,结果位才为1 ,否则为0。 |:按位或 :只要有1个为1结果为1。 ^:异或 :相同为0,不同为1.
异或的应用:交换2个值
赋值操作符
自己赋值。 例如:
int a = 10;
复合赋值符
+= 、 -= 、*= 、 /= 、 %= 、 >>= 、 <<= 、 &= 、 |= 、 ^=
单目操作符
! : 逻辑反操作 - : 负值 + :正值 & :取地址 sizeof :操作数的类型长度(以字节为单位) ~ :对一个数的二进制按位取反 -- :前置、后置– ++ :前置、后置++ * : 间接访问操作符(解引用操作符) (类型) 强制类型转换
关系操作符
·>· = < <= != ==
逻辑操作符
&& :逻辑与 全真为真,1个为假就为假 || :逻辑或 1个为真就为真,全假才是假
注意区别:& 和|
条件操作符
表达式1?表达式2:表达式3
先求解表达式1, 若其1值为真(非0)则将表达式2的值作为整个表达式的取值, 否则(表达式1的值为0)将表达式3的值作为整个表达式的取值。
逗号表达式
表达式1,表达式2,表达式3 …
逗号表达式,就是用逗号隔开的多个表达式。 逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果。
表达式求值
表达式求值的顺序一部分是由操作符的优先级和结合性决定。 同样,有些表达式的操作数在求值的过程中可能需要转换为其他类型
隐式类型转换
C的整型算术运算总是至少以缺省整型类型的精度来进行的。 为了获得这个精度,表达式中的字符和短整型操作数 在使用之前被转换为普通整型,这种转换称为整型提升 。
整形提升是按照变量的数据类型的符号位来提升的
正数整形提升,高位补充符号位,即为0 负数整形提升,高位补充符号位,即为1
算术转换
如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数的转换为另一个操作数的类型,否则操作就无法进行。下面的层次体系称为寻常算术转换。 long double double float unsigned long int long int unsigned int int 如果某个操作数的类型在上面这个列表中排名较低,那么首先要转换为另外一个操作数的类型后执行运算。 注意:但是算术转换要合理,要不然会有一些潜在的问题。
float f = 3.14;
int num = f;
操作符的属性
复杂表达式的求值有三个影响的因素。
- 操作符的优先级
- 操作符的结合性
- 是否控制求值顺序。
两个相邻的操作符先执行哪个?取决于他们的优先级。如果两者的优先级相同,取决于他们的结合性。
|