优先级
最高的 ()[] -> .
! ~ ++ -- - (type)x/(type x) * & sizeof
* / % + -
<< >>
< <= > >=
== !=
& ^ | && || ?:
= += -= *= /= %= <<= >>= &= ^= |=
最低的 ,
结合方向
除了 单 三 赋值运算符这三种是从右往左外,其他的都是从左往右
细节
++自增运算符 ,存在a++和++a两种情况
前者代表先传递值然后自加,后者代表先自加然后传递值
关系运算符的结果是一个逻辑值:关系成立则为真,值为1 关系不成立则为假,值为0
左移和右移位移的是存在内存中的二进制代码,即补码
左移一位等同于*2,且高位左移溢出了就丢弃
右移一位等同于/2,切低位超出也会被舍弃,右移时左边高位如果是无符号数则补0,有符号的称为算术右移,符号位如果是0则补0,符号位如果是1则补1
如(a+7)>>3 +7的存在用于解决右移过程中向负数取整的问题
~取反的操作包括符号位在内一并取反
位运算的操作对象必须是 char short int
&按位与 与1不变 与0置0
|按位或 或0不变 或1置1
^按位异或 对应位相同为0 若不同则为1
a+=2与a=a+2等价 但是由于内部副本机制,效率上a+=2要高于后者
按位操作要秉承先清0后写入的顺序操作,如下
a&~(0x7<<27)|(0x5<<27)
&& || ! 逻辑运算 表达式的结果用真1或假0表示
0表示逻辑假值
-0 0.0 \0 NULL 等效
非0即表示逻辑真 如5 3 !0
逻辑||运算存在求值顺序,当左边为真时,右边即短路不再运算
如 0&& b=2 关系式左边已经为假,逻辑关系式结果必定为假0,那么右边的赋值运算便不再继续,称为短路