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)。

++-(负号)运算符是单目运算符,只能在运算符的一侧出现一个运算对象(如-ai++--i(float)isizeof(int)*p等)。

条件运算符是C语言中唯一的三木运算符,如x?a:b

从上表中可以大致归纳出各类运算符的优先级

以上的优先级别由上到下递减。初等运算符优先级最高,逗号运算符优先级最低。

位运算符的优先级比较分散(有的在算术运算符之前(如~),有的在关系运算符之前(如<<>>),有的在关系运算符之后(如&^|))。

为了容易记忆,使用位运算符时可加圆括号。

总结