C语言的运算符优先级从上到下递减可表示为:
1. ( ) [ ] -> . 自左向右结合
2. ! ~ ++ -- - (type) * & sizeof 自右向左结合
3. * / % 自左向右结合
4. + - 自左向右结合
5. << >> 自左向右结合
6. < <= > >= 自左向右结合
7. == != 自左向右结合
8. & 自左向右结合
9. ^ 自左向右结合
10. | 自左向右结合
11. && 自左向右结合
12. || 自左向右结合
13. ?: 自右向左结合
14. assignmens 自右向左结合
15. , 自左向右结合
优先级顺序准则:
优先级最高的是数组下标、函数调用、结构成员;
单目运算符优先级高于双目运算符;
在双目运算符中:
算术运算符高于移位运算符;
移位运算符高于关系运算符;
关系运算符高于逻辑运算符;
逻辑运算符高于赋值运算符。
例:
a.b.c 为 (a.b).c 自左至右结合
*p() 为 *(p(c)) 函数调用优先级高于 *
*p++ 为 *(p++) 单目自右向左结合,指针先加1再取值
a<b == c<d 为 (a<b )== (c<d) 关系运算符高于逻辑运算符
tax = income>4000 && residency<5 ? 3.5:2.0 为
tax = (((income>4000) && (residency<5)) ? 3.5:2.0)
home =vistor =0 为 home =(vistor =0) 自右向左结合
while (c = get(in) != EOF) 为 while (c = (get(in) != EOF)) != 优先级高于 =
(t=BTYPE(pt1->aty)==STRTY) || t ==UNIONTY 为
(t=((BTYPE(pt1->aty))==STRTY)) || (t ==UNIONTY)
flags & FLAG != 0 为 flags & (FLAG != 0)
r = hi << 4+low 为 r = hi << (4+low)
C缺陷与陷阱 (2.2)