在 C 语言中,运算符的优先级决定了在表达式中运算符的计算顺序。以下是 C 语言中运算符优先级表,按从高到低的顺序排列:
1. **括号**: `()`
2. **后缀运算符**: `[]` (数组下标), `()` (函数调用), `.` (成员访问), `->` (指向成员访问), `++` (后缀自增), `--` (后缀自减)
3. **一元运算符**: `++` (前缀自增), `--` (前缀自减), `+` (正号), `-` (负号), `!` (逻辑非), `~` (按位取反), `(type)` (类型转换), `*` (指针解引用), `&` (取地址), `sizeof` (求大小)
4. **乘法和除法**: `*` (乘法), `/` (除法), `%` (取模)
5. **加法和减法**: `+` (加法), `-` (减法)
6. **移位运算符**: `<<` (左移), `>>` (右移)
7. **关系运算符**: `<` (小于), `<=` (小于等于), `>` (大于), `>=` (大于等于)
8. **相等运算符**: `==` (等于), `!=` (不等于)
9. **按位与**: `&`
10. **按位异或**: `^`
11. **按位或**: `|`
12. **逻辑与**: `&&`
13. **逻辑或**: `||`
14. **条件运算符**: `?:`
15. **赋值运算符**: `=`, `+=`, `-=`, `*=`, `/=`, `%=`, `<<=`, `>>=`, `&=`, `^=`, `|=`
16. **逗号运算符**: `,`
在表达式中,高优先级的运算符会先于低优先级的运算符执行。如果运算符的优先级相同,则按照其结合性(左结合或右结合)决定计算的顺序。
() 的优先级最高,[ ] 第二, * ,&第三。所以:
int *p; //一个指针
int *p[3]; //三个指针
int *p[2][3]; //两行三列共6个指针
int (*p)[3]; //一个行的指针,但此行含三个元素
int (*p)[2][3]; //一个2×3的指针
#include <stdio.h>
#include <stdlib.h>int main(void){int p2[3]={1,2,3};int *p22[3]={p2,p2+1,p2+2};int *p33=p2;printf("%d\n",*p22[1]);int p4[2][3]={{1,2,3},{11,22,33}};int (*p41)[3]=p4;printf("%d\n", *(*(p41+1)+1));int *s=&p4[0][0];int *p42[6]={s,s+1,s+2,s+3,s+4,s+5};printf("%d\n",*p42[5]);int *p5[2][3]={{s,s+1,s+2},{s+3,s+4,s+5}};printf("%d\n",*p5[1][0]);return 0;
}