C语言优先级

27 篇文章 0 订阅
20 篇文章 0 订阅

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个: ,
  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值