您的位置:首页 > 编程语言 > C语言/C++

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个: ,
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: