C语言操作符
整理一下C语言操作符优先级,参考自《C和指针》
操作符 |
描述 |
用法示例 |
结果类型 |
结合性 |
是否控制 求值顺序 |
( ) |
聚组 |
(表达式) |
与表达式相同 |
/ |
否 |
( ) |
函数调用 |
Rexp(Rexp,...,Rexp) |
Rexp |
L-R |
否 |
[ ] |
下标引用 |
Rexp [ Rexp ] |
Loca |
L-R |
否 |
. |
访问结构成员 |
Loca.member_name |
Loca |
L-R |
否 |
-> |
访问 结构指针 成员 |
Rexp->member_name |
Loca |
L-R |
否 |
++ -- |
后缀 自增 自减 |
Loca++ |
Rexp |
L-R |
否 |
! |
逻辑非 |
!Rexp |
Rexp |
R-L |
否 |
~ |
按位取反 |
~Rexp |
Rexp |
R-L |
否 |
+ - |
单目,正 负 |
+Rexp |
Rexp |
R-L |
否 |
++ -- |
前缀 自增 自减 |
++Loca |
Rexp |
R-L |
否 |
* |
间接访问 |
*Rexp |
Loca |
R-L |
否 |
& |
取地址 |
&Loca |
Rexp |
R-L |
否 |
sizeof |
取其 字节长度 |
sizeof Rexp sizeof (类型) |
Rexp |
R-L |
否 |
(类型) |
类型转换 |
(类型)Rexp |
Rexp |
R-L |
否 |
* / % |
乘 除 求余 |
Rexp * Rexp |
Rexp |
L-R |
否 |
+ - |
加 减 |
Rexp + Rexp |
Rexp |
L-R |
否 |
<< >> |
左移 右动 |
Rexp << Rexp |
Rexp |
L-R |
否 |
> >= < <= |
比较 |
Rexp > Rexp |
Rexp |
L-R |
否 |
== != |
比较 |
Rexp == Rexp |
Rexp |
L-R |
否 |
& |
位与 |
Rexp & Rexp |
Rexp |
L-R |
否 |
^ |
位异或 |
Rexp ^ Rexp |
Rexp |
L-R |
否 |
| |
位或 |
Rexp | Rexp |
Rexp |
L-R |
否 |
&& |
逻辑与 |
Rexp && Rexp |
Rexp |
L-R |
是 |
|| |
逻辑或 |
Rexp || Rexp |
Rexp |
L-R |
是 |
?: |
条件操作符 |
Rexp ? Rexp : Rexp |
Rexp |
/ |
是 |
= |
赋值 |
Loca = Rexp |
Rexp |
R-L |
否 |
+= -= *= /= %= |
以...加 |
Loca += Rexp |
Rexp |
R-L |
否 |
<<= >>= |
以...左移 |
Loca <<= Rexp |
Rexp |
R-L |
否 |
&= ^=|= |
以...位与 |
Loca &= Rexp |
Rexp |
R-L |
否 |
, |
逗号 |
rexp, ..., rexp |
Rexp |
L-R |
是 |
左址=右值:以赋值符号 = 为界。位于赋值操作符左侧的表达式,称之为左址,左址表示存储在内存中的可写对象,因此表达式的计算结果必须占有可写的内存空间,通过这个内存地址,就可以对内存进行写操作;这也就是为什么左址可以被赋值的原因了
右值表达式,当一个符号或者常量放在赋值操作符的右边的时候,计算机就读取(并计算)他们的值,左址可写可读,显然也可以作为右值。
L-value:L应理解成 Location,表示定位,地址;
R-value:R 应理解成 Read,表示读取数据。
结合性:一串操作符是从左向右依次执行,还是从右向左依次执行。
控制求值顺序:它们或能够保证某个子表达式能够在另一个表达式求值之前计算,或者跳过某个表达式。