C语言运算符和结合性
| 优先级 | 运算符 | 含义 | 要求运算对象的个数 | 结合方向 |
|---|---|---|---|---|
| 1 | () |
圆括号 | 自左至右 | |
| 1 | [] |
下标运算符 | 自左至右 | |
| 1 | -> |
指向结构体成员运算符 | 自左至右 | |
| 1 | · |
结构体成员运算符 | 自左至右 | |
| 2 | ! |
逻辑非运算符 | 1(单目运算符) | 自右至左 |
| 2 | ~ |
按位取反运算符 | 1(单目运算符) | 自右至左 |
| 2 | ++ |
自增运算符 | 1(单目运算符) | 自右至左 |
| 2 | -- |
自减运算符 | 1(单目运算符) | 自右至左 |
| 2 | - |
负号运算符 | 1(单目运算符) | 自右至左 |
| 2 | (类型) |
类型转换运算符 | 1(单目运算符) | 自右至左 |
| 2 | * |
指针运算符 | 1(单目运算符) | 自右至左 |
| 2 | & |
取地址运算符 | 1(单目运算符) | 自右至左 |
| 2 | sizeof |
长度运算符 | 1(单目运算符) | 自右至左 |
| 3 | * |
乘法运算符 | 2(双目运算符) | 自左至右 |
| 3 | / |
除法运算符 | 2(双目运算符) | 自左至右 |
| 3 | % |
求余运算符 | 2(双目运算符) | 自左至右 |
| 4 | + |
加法运算符 | 2(双目运算符) | 自左至右 |
| 4 | - |
减法运算符 | 2(双目运算符) | 自左至右 |
| 5 | << |
左移运算符 | 2(双目运算符) | 自左至右 |
| 5 | >> |
左移运算符 | 2(双目运算符) | 自左至右 |
| 6 | < <= > >= |
关系运算符 | 2(双目运算符) | 自左至右 |
| 7 | == |
等于运算符 | 2(双目运算符) | 自左至右 |
| 7 | != |
不等于运算符 | 2(双目运算符) | 自左至右 |
| 8 | & |
按位与运算符 | 2(双目运算符) | 自左至右 |
| 9 | ^ |
按位异或运算符 | 2(双目运算符) | 自左至右 |
| 10 | | |
按位或运算符 | 2(双目运算符) | 自左至右 |
| 11 | && |
逻辑与运算符 | 2(双目运算符) | 自左至右 |
| 12 | || |
逻辑或运算符 | 2(双目运算符) | 自左至右 |
| 13 | ? : |
条件运算符 | 3(三目运算符) | 自右至左 |
| 14 | = += -= *= /= %= >>= <<= &= ^= |= |
赋值运算符 | 2(二目运算符) | 自右至左 |
| 15 | , |
逗号运算符(顺序求值运算符) | 自左至右 |
同一优先级的运算符,运算次序由结合方向决定。
-和++为同一优先级,结合方向为自右至左,因此-i++相当于-(i++);
不同的运算符要求有不同的运算对象个数,如+和-为双目运算符,要求在运算符两侧各有一个运算对象(3+5)。
而++和-(负号)运算符是单目运算符,只能在运算符的一侧出现一个运算对象(如-a、i++、--i、(float)i、sizeof(int)、*p等)。
条件运算符是C语言中唯一的三木运算符,如x?a:b。
从上表中可以大致归纳出各类运算符的优先级

以上的优先级别由上到下递减。初等运算符优先级最高,逗号运算符优先级最低。
位运算符的优先级比较分散(有的在算术运算符之前(如~),有的在关系运算符之前(如<<和>>),有的在关系运算符之后(如&、^、|))。
为了容易记忆,使用位运算符时可加圆括号。