初级运算符( )、[ ]、->、.  高于  单目运算符  高于  算数运算符(先乘除后加减)  高于  关系运算符  高于  逻辑运算符(不包括!)  高于  条件运算符  高于  赋值运算符  高于  逗号运算符。

位运算符的优先级比较分散。

除了赋值运算符、条件运算符、单目运算符三类的平级运算符之间的结合顺序是从右至左,其他都是从左至右。

 

C语言运算符优先级

 



优先级



运算符



名称或含义



使用形式



结合方向



说明



1



[]



数组下标



数组名[常量表达式]



左到右



--



()



圆括号



(表达式)/函数名(形参表)



--



.



成员选择(对象)



对象.成员名



--



->



成员选择(指针)



对象指针->成员名



--



2



-



负号运算符



-表达式



右到左



单目运算符



~



按位取反运算符



~表达式



++



自增运算符



++变量名/变量名++



--



自减运算符



--变量名/变量名--



*



取值运算符



*指针变量



&



取地址运算符



&变量名



!



逻辑非运算符



!表达式



(类型)



强制类型转换



(数据类型)表达式



--



sizeof



长度运算符



sizeof(表达式)



--



3



/





表达式/表达式



左到右



双目运算符



*





表达式*表达式



%



余数(取模)



整型表达式%整型表达式



4



+





表达式+表达式



左到右



双目运算符



-





表达式-表达式



5



<< 



左移



变量<<表达式



左到右



双目运算符



>> 



右移



变量>>表达式



6





大于



表达式>表达式



左到右



双目运算符



>=



大于等于



表达式>=表达式





小于



表达式<表达式



<=



小于等于



表达式<=表达式



7



==



等于



表达式==表达式



左到右



双目运算符



!=



不等于



表达式!= 表达式



8



&



按位与



表达式&表达式



左到右



双目运算符



9



^



按位异或



表达式^表达式



左到右



双目运算符



10



|



按位或



表达式|表达式



左到右



双目运算符



11



&&



逻辑与



表达式&&表达式



左到右



双目运算符



12



||



逻辑或



表达式||表达式



左到右



双目运算符



13



?:



条件运算符



表达式1?

表达式2: 表达式3



右到左



三目运算符



14



=



赋值运算符



变量=表达式



右到左



--



/=



除后赋值



变量/=表达式



--



*=



乘后赋值



变量*=表达式



--



%=



取模后赋值



变量%=表达式



--



+=



加后赋值



变量+=表达式



--



-=



减后赋值



变量-=表达式



--



<<=



左移后赋值



变量<<=表达式



--



>>=



右移后赋值



变量>>=表达式



--



&=



按位与后赋值



变量&=表达式



--



^=



按位异或后赋值



变量^=表达式



--



|=



按位或后赋值



变量|=表达式



--



15





逗号运算符



表达式,表达式,…



左到右



--



说明:

同一优先级的运算符,运算次序由结合方向所决定。

简单记就是:! > 算术运算符 > 关系运算符 > && > || > 赋值运算符

 

C语言运算符优先级表_双目运算符 

上表中可以总结出如下规律:

  1. 结合方向只有三个是从右往左,其余都是从左往右。
  2. 所有双目运算符中只有赋值运算符的结合方向是从右往左。
  3. 另外两个从右往左结合的运算符也很好记,因为它们很特殊:一个是单目运算符,一个是三目运算符。
  4. C语言中有且只有一个三目运算符。
  5. 逗号运算符的优先级最低,要记住。
  6. 此外要记住,对于优先级:算术运算符 > 关系运算符 > 逻辑运算符 > 赋值运算符。逻辑运算符中“逻辑非 !”除外。

 

一些容易出错的优先级问题

上表中,优先级同为1 的几种运算符如果同时出现,那怎么确定表达式的优先级呢?这是很多初学者迷糊的地方。下表就整理了这些容易出错的情况:


优先级问题

表达式

经常误认为的结果

实际结果

. 的优先级高于 *(-> 操作符用于消除这个问题)

*p.f

p 所指对象的字段 f,等价于:

(*p).f

对 p 取 f 偏移,作为指针,然后进行解除引用操作,等价于:

*(p.f)

[] 高于 *

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

(msb << 4) + lsb

msb << (4 + lsb)

逗号运算符在所有运 算符中优先级最低

i = 1, 2

i = (1,2)

(i = 1), 2

这些容易出错的情况,希望读者好好在编译器上调试调试,这样印象会深一些。一定要多调试,光靠看代码,水平是很难提上来的。调试代码才是最长水平的。