类别
优先级最高的并不是真正意思上的运算符
优先级 | 运算符 | 名称或含义 | 使用形式 | 结合方向 | 说明 |
---|
1 | [ ] | 数字下标 | 数组名[常量表达式] | 左到右 | |
2 | ( ) | 圆括号 | (表达式)/函数名(形参表) | 左到右 | |
3 | . | 成员选择(对象) | 对象.成员名 | 左到右 | |
4 | -> | 成员选择(指针) | 对象指针->成员名 | | |
单目运算符
优先级 | 运算符 | 名称或含义 | 使用形式 | 结合方向 |
---|
1 | - | 负号运算符 | -表达式 | 右到左 |
2 | (类型) | 强制类型转换 | (数据类型)表达式 | 右到左 |
3 | ++ | 自增运算符 | ++变量名/变量名++ | 右到左 |
4 | - - | 自减运算符 | –变量名/变量名– | 右到左 |
5 | * | 取值运算符 | *指针变量 | 右到左 |
6 | & | 取地址运算符 | &变量名 | 右到左 |
7 | ! | 逻辑非运算符 | !表达式 | 右到左 |
8 | ~ | 按位取反运算符 | ~表达式 | 右到左 |
9 | sizeof | 长度运算符 | sizeof(表达式) | 右到左 |
双目运算符
优先级 | 运算符 | 名称或含义 | 使用形式 | 结合方向 |
---|
1 | / | | | |
2 | * | | | |
3 | % | | | |
一些容易出错的优先级问题
优先级问题 | 表达式 | 经常误认为的结果 | 实际结果 |
---|
.的优先级高于* | *p.f | p所指对象的字段f | 对p取f偏移,作为指针,然后进行解除引用操作,*(p.f) |
()高于[ ] | int (*ap)[n] | xxxx | ap是指向一个具有 n个int数组的指针 |
[ ]高于 * | int *ap[ ] | ap是个指向int数组的指针,int(*ap)[ ] | ap是个元素为int指针的数组 int *(ap[ ]) |
函数( )高于* | int *fp( ) | fp是个函数指针,所指函数返回int。int(*fp)( ) | fp是个函数,返回int *, int * (fp()) |
==和!=高于位操作 | (val & mask !=0) | (val & mask) != 0 | val & (mask!=0) |
==和!=高于赋值符 | c = getchar( ) != EOF | (c = getchar())!=EOF | c = (getchar != EOF) |
算术运算符高于移位运算符 | msb<< 4 + lsb | (mab<<4) +lsb | msb<<(4+lsb) |
“== ” 与 “&” 优先级
if( a & b == c)
{
function();
}
原因: == 优先级要比 &高,因此,此处先会判断bc的结果,然后再去执行a & (bc)。
上述语句与我们实际想要的结果相反,我们本意是希望判断((a&b)== c)。