概述
本文深入先容了与指针和数组相关的运算符优先级,利用代码示例展示了当左结合和右结合运算符同时存在时的结合方式,同时也演示了如何利用()来欺压人为指定结合次序。
指针、数组相关的运算符优先级
下表展示了相关运算符的优先级,有4个级别,同级别内的运算符按照结合性依次调用。这4类也是所有运算符中优先级最高的4档,其它的运算符优先级都比它们低:
优先级运算符描述结合性1::作用域解析左结合2()
[]
.
->欺压运算结合,函数形参列表
数组元素下标访问
类的成员访问
类指针的成员访问右结合3(int)
*
&欺压转换
指针解引用
变量取地址左结合4.*
->*类的成员指针
类指针的成员指针左结合容易产生困惑的、需要细致进行优先级判断的往往是一个左结合加一个右结合,例如:
- *ptr[]
- (int)a()
- &class->data
- obj->*fun()
请记住一个紧张方法:当我们需要改变运算符的结合次序(C++默认的优先级不是我们的意愿)时,可以通过添加()来人为欺压指定优先次序,因为()是除了::以外具有最高优先级的一类运算符。
简朴例子:以[]和*为例探究运算符结合规律
下面的p1, p2是数组,p3是指针:- int *p1[2]; // p1是一个数组,元素个数为2,每个元素为(int*)
- int *(p2[2]); // 等价于*p2[2],p2是一个数组
- int (*p3)[2]; // p3是一个指针,指向一个int数组,这个int数组的元素个数必须是2!
复制代码 因此只要记住两点即可:
- **[]的优先级高于* **:即*p1[2]和*(p1[2])等价。
- 这个优先级同时适用于界说语句(*为指针界说符)和执行语句(*为解引用符)中:
[code]int *p1[2]; // 界说语句:先看[]:p1是一个数组,元素个数为2,每个元素为(int*)。等价于*(p1[2])int (*p2)[2]; // 界说语句:先看*: p2是一个指针,指向一个int数组,这个int数组的元素个数必须是2!cout |