C语言优先级
2012-10-28 22:14
120 查看
1、优先级图表
优先级最高者不是真正意义上的运算符,包括:数组下标,函数调用,结构体成员选择符。
单目运算符的优先级次之。(! ~ ++ -- - (type) * & sizeof)
然后是双目运算符。双目运算符里, 算数运算符(* / % + -)优先级最高, 移位(<< >>)次之, 关系运算符(< <= > >= != ==)再次之, 接着是位运算符(& ^ | ),逻辑运算符(&& ||) 条件运算符(?: 三目),赋值运算符(= ...)。
任何一个逻辑运算符的优先级低于任何一个关系运算符
。
移位运算符的优先级比算数运算符要低,但是比关系运算符要高。
2、运算符实例
a.while (c = getc(in) != EOF) putc(c, out)循环的意思是复制一个文件到另一个文件。但是由于!=的优先级比赋值运算符的优先级高,所以c被赋予了getc()的返回值与EOF比较后的布尔值,结果向out中写入了一堆1.
b. 解释下面几个声明
char *p[]; char (*p)[]; int *fp(); int (*fp)();
char *p[] 常常被错误的理解为指向字符数组的指针。正确的是p一个数组,里面元素是指向字符的指针类型。
char (*p)[] p是指向指向字符数组的指针。
int *fp() 常常错误理解为函数指针,该函数返回int类型。正确的是fp是一个函数,他返回一个执行int的指针。
int (*fp)() fp是函数指针,该函数返回int类型。
c. 解释下面的表达式
*p.f; val & mask != 0; max = val1 > val2 ? val1 : val2;*p.f 对p去f偏移,作为指针,然后进行解引用。相当与*(p.f),因为.的优先级高与*。比较(*p).f。
val & mask != 0 相当与val & (mask != 0).
max = val1 > val2 ? val1 : val2 相当与 max = (val1 > val2 ? val1 :val2).
d. 一个复杂的声明
char *(* c[10])(int **p);
1. 有两个小括号,小括号的结合行是自左向右,所以先关注第一个小括号,简化声明(*c[10])();
c是一个数组,里面放10指针,后面紧跟这一个括号,所以这些指针是函数指针。
2. 关注第二个括号,(int **p)
显然p是函数的参数,它是个指向指针的指针。
3. 这看最前面的* char *说明该函数的返回值是一个指向字符的指针。
4. 这个声明的意思就是:c是一个数组,里面有10个函数指针,指向的函数返回指针,指向字符,函数的参数是指向int类型指针的指针。
3、 优先级顺口溜
醋坛酸味灌味落跳福豆
共44个运算符
醋-初等,4个: ( ) [ ] -> 指向结构体成员. 结构体成员
坛-单目,9个: ! ~ ++ -- -负号(类型) *指针
&取地址 sizeof长度
酸-算术,5个: * / % + -减
味-位移,2个: << >>
灌-关系,6个: < <= > >= == 等于 != 不等于
味-位逻,3个: & 按位与^ 按位异或 | 按位或
落-逻辑,2个: && 逻辑与|| 逻辑或
跳-条件,1个:三目:? :
福-赋值,11个:= += -= *= /= %= >>= <<= &= ^= |=
豆-逗号,1个: ,