指针中相对复杂的主要有三类情况:指针数组、数组指针和函数指针,以及三者相互嵌套的情况。弄清楚C中各类符号的运算优先级才能真正理解其含义。

C语言运算符号优先级

优先级 运算符 结合律
1 后缀运算符:[],(),.,->,++,-- 从左到右
2 一元运算符:++,--,!,~,+,-,*,&,size_of 从右到左
3 类型转换运算:(int) 从右到左
4 乘除运算符:*,/,% 从左到右
5 加减运算符:+,- 从左到右
6 移位运算符:<<,>> 从左到右
7 关系运算符:<,<=,>,>= 从左到右
8 相等运算符:==,!= 从左到右
9 位与运算符:& 从左到右
10 位异或运算符:^ 从左到右
11 位或运算符:| 从左到右
12 逻辑与运算符:&& 从左到右
13 逻辑或运算符:|| 从左到右
14 条件运算符:?: 从右到左
15 赋值运算符:=,+=,-=,*=,/=,%=,&=,^=,|=,<<=,>>= 从右到左
16 逗号运算符:, 从左到右

运算符优先级和结合律

int *p[3];
// [],*,int:数组,里面是指针,指向int
int (*p)[3];
// *,[],int:指针,指向数组,数组中是int
int (*p)(int a);
// *,(int a),int:指针,指向参数为(int a)的函数,函数返回int
int (*p[3])(int a);
// [],*,(int a),int:数组,数组中是指针,指向参数为(int a)的函数,函数返回int
int(*(*p())[])();
// (),*,[],*,(),int:无参函数,返回一个指针,指向一个数组,数组中是指针,指向一个无参函数,函数返回int

[]运算级比*高

参考

  1. C语言运算符优先级
  2. C语言总结
  3. C复杂指针
最后修改日期: 2021-10-09