文章目录

  • 前言
  • 故事的开端
  • 什么是运算符的优先级和结合方向
    • 优先级
    • 结合方向
  • 故事在这能结束吗?
  • 总结
  • 吐槽

前言

写这篇就为了再遇到稍微复杂一点的表达式不至于绕晕;优先级和结合方向不再赘述,随便一搜就都有了,在优先级和结合方向上我借鉴的是这篇;
注意,虽然有优先级和结合方向一说,但是程序不止是给机器编译的,也是给人看的,做个人,该括括号的时候,尽量提高可读性吧!
如有错误欢迎评论指出。

故事的开端

 for (i = 0; i < XSK_RING_PROD__DEFAULT_NUM_DESCS; i ++)*xsk_ring_prod__fill_addr(&xsk_info->umem->fq, idx++) =xsk_alloc_umem_frame(xsk_info);

第一眼看过去,你知道执行顺序吗?嗯……第一眼觉得很简单,然后有一点犹豫,因为不知道为什么会这样执行,只是觉得就该这样。
然后就有了这篇文章,不止自己要清楚,还要给别人讲清楚。

什么是运算符的优先级和结合方向

优先级

先拿简单例子来讲:

*p++;

我们知道自增运算符++的优先级与取值运算符*相同,恰好是同优先级的特例,同优先级看结合方向(同优先级结合方向是一致的),那么把自己想象成计算机,看向这条语句,我们只解析,不纠错:

注:随便抄的一个例子,里面说自增符++的优先级高于取值符*, 仔细一看发现说的错的,优先级根本是一样的,只好先说同优先级的例子;

Think like a computer:
> 我们从高优先级开始扫描,其他部分统一视作一个"块",发现优先级2:
> [*] [块0] [++]
> 按结合方向处理,2优先级的从右往左,也就是先处理右边的[++]
> [++]单目运算符,直接往左;
> 从[++]往左,到[块0],再撞到运算符[*],好了停下来,我们结合一下:
> [*]([块0]++),恰巧[块0]里面没有关键字符要处理了,直接:
> [*](p++)
> 到这里人已经一眼可以看出来结果了,可是计算机要再处理一下:
> 处理下一个优先级2的运算符,括号外往左,到[*],右结合,向右看,只有一整个块(p++),所以:
> (*(p++)),整个语句已成块,工作结束;

补一张图示:

所以上面那个例子应该等效为:

*(p++);

从可读性上来讲,还是后者更好一些;

结合方向

从右往左意味着:

  • 同优先级下处理顺序从右往左(见上个例子);
  • 双目运算符先向右处理;
  • 单目运算符直接往有效方向处理,无效方向括号封住;(如上个例子,但按照语言的设计,就算先向右处理应该也无伤大雅)

还是先简单例子:

a=b=c

赋值运算符=是从右往左,也就是先右后左;

Think like a computer:
> 我们从高优先级开始扫描,其他部分统一视作一个"块",发现优先级14:
> [块0] [=]① [块1] [=]② [块2]
> 按结合方向处理,14优先级的从右往左,也就是先处理右边的[=]②
> [=]②双目运算符,先看向右,右边的[块2],再撞到尽头,结束,画上右括号标记一下,恰好没有关键字符要处理了,偷个懒直接处理成c
> [块0] [=]① [块1] [=]② c)
> 再从[=]②向左,到[块1](顺便处理成b),再撞到运算符[=]①,好了停下来,我们画上左括号标记结合:
> [块0] [=]①(b = c)
>偷个懒,用箭头和括号代替接下来的文字描述:
> [=]① --> (b = c) --> 尽头
[块0] [=]①(b = c))
> 尽头 <-- [块0] <-- [=]①
([块0] [=]①(b = c))
> END

再来练一个例子,再次偷懒,还是画图快:

f1() * f2() + f3();

故事在这能结束吗?

回到一开始的例子:

*xsk_ring_prod__fill_addr(&xsk_info->umem->fq, idx++) =xsk_alloc_umem_frame(xsk_info);

简化一下:

*fill(&fq, idx++) = alloc_frame(info);

开始分析:

也就是说:

  1. 先从左到右把两个函数调用;
  2. 再对fill返回的地址进行取值;
  3. 再把alloc_frame函数返回的值赋给fill返回地址的取值。

和GDB跟的结果一样,那故事就在这结束吧。

总结

Think like a computer:

  1. 先处理高优先级运算符,同优先级按结合方向处理;
  2. 按照结合方向,从运算符延伸,撞到其他运算符或语句尽头即停止,画上分割括号;
  3. 括号运算符/分割括号内看做一个整体,单独讨论;

这种方法仅起一个帮助作用,能够让初学者遇到复杂式子时有一个范式,能够理解复杂语句执行的顺序。但真要快速理解复杂的代码,还得靠多年的经验和实际的调试。

吐槽

这段代码加个括号瞬间就没什么事情了:

 for (i = 0; i < XSK_RING_PROD__DEFAULT_NUM_DESCS; i ++)*(xsk_ring_prod__fill_addr(&xsk_info->umem->fq, idx++)) =xsk_alloc_umem_frame(xsk_info);

一文解决C语言运算符的优先性与结合性——Think like a computer相关推荐

  1. c++语言运算符的优先次序,C++中的运算符和运算符优先级总结

    运算符是一种告诉编译器执行特定的数学或逻辑操作的符号.C++ 内置了丰富的运算符,并提供了以下类型的运算符: 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 杂项运算符 本文将逐一介绍算术运 ...

  2. c语言的int型运算符,C语言运算符

    本词条缺少概述图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧! C语言运算符是说明特定操作的符号[1] ,它是构造C语言表达式的工具[2] .C语言的运算异常丰富,除了控制语句和输入输出以外 ...

  3. c语言中求字节的运算符是,初学者单片机C语言运算符

    单片机C语言运算符 单片机及C语言学习 auto        存储种类说明        用以说明局部变量,缺省值为此 break        程序语句        退出最内层循环 case  ...

  4. C语言的本质(7)——C语言运算符大全

    C语言的本质(7)--C语言运算符大全 C语言的结合方向 C语言中各运算符的结合性分为两种,即左结合性(自左至右)和右结合性(自右至左).例如算术运算符的结合性是自左至右,即先左后右.如有表达式 x- ...

  5. c语言的运算符优先级文档下载,c语言运算符优先级

    c语言运算符优先级Tag内容描述: 1.运算符的优先级与结合律(从高到低排列)=优先级 名称 符号 结合性 1 数组下标 左结合性 1 函数调用 () 左结合性 1 结构和联合的成员. - 左结合性 ...

  6. c语言的运算符优先级文档下载,C语言运算符优先级汇总口诀表

    圆下箭头一顿号 非凡增减富强针地长 三乘除,四加减,五移位 千万别把鱼忘记,它在盛饭的厨子里 小灯大灯灯灯不等 爸喂鱼,舅疑惑,裸鸡也疑惑 十三姨,十四父,十五逗,兜到低 "圆下箭头一顿号& ...

  7. c语言运算符优先级结合,C语言运算符优先级及结合性

    今天去翻了下C语言运算符的优先级和结合性,发现当初学习的时候就没认真记住,惭愧.发现一篇讲得不错的文章,编辑了下转来供以后翻阅. C语言运算符优先级表(由上至下,优先级依次递减) 运算符 结合性 () ...

  8. C语言运算符优先级及结合性

    今天去翻了下C语言运算符的优先级和结合性,发现当初学习的时候就没认真记住,惭愧.发现一篇讲得不错的文章,编辑了下转来供以后翻阅. C语言运算符优先级表(由上至下,优先级依次递减) 运算符 结合性 () ...

  9. C语言运算符的优先级和结合

    今天去翻了下C语言运算符的优先级和结合性,发现当初学习的时候就没认真记住,惭愧.发现一篇讲得不错的文章,编辑了下转来供以后翻阅. C语言运算符优先级表(由上至下,优先级依次递减) 运算符 结合性 () ...

最新文章

  1. ubuntu系统下载编译android源码
  2. 改变Eclipse主题颜色
  3. Oracle Exadata迈入十年将助企业迈向数位转型之路
  4. SQL注入(SQL注入(SQLi)攻击)攻击-布尔盲注
  5. ajax 关闭弹窗并跳转到url_Python 爬虫 | Ajax数据爬取
  6. 物联网中对视频远程传输解决方案
  7. html5抓娃娃机微信小游戏源码
  8. 小公司代理记账报税常见问题
  9. qpython3下载不了_qpython3手机版
  10. 来 看 T r i e 吧
  11. apigateway-kong(二)admin-api(结合实例比官网还详细)
  12. Hypermesh2D网格划分实例1
  13. 怎么学好Web前端开发 有哪些相关书籍推荐
  14. B. Sereja and Mirroring
  15. 芯片架构RISC-V、X86、ARM三足鼎立
  16. c语言中格式符号错误,C语言中符号格式说明
  17. 网络安全如何进行培训才有效
  18. 腾讯私有云MySQL解决方案—TDSQL
  19. 北伐日记 Vol.14-愤青与商人
  20. [WTL/ATL]_[初级]_[TreeView控件如何显示ToolTip]

热门文章

  1. python做乘法运算定律_《乘法运算定律》(一)教学设计
  2. Druid基本概念及架构介绍
  3. Pycharm | cv2爆红 | opencv-python安装 | Requirement already satisfied: opencv-python 有效解决方法
  4. 第十二期 | 万元的正版课程仅花9.9就可买到?
  5. gcc 编译时中-L -l -Wall的含义
  6. Vue视频流播放器 Vue-Core-Video-Player
  7. 微信小程序商城源码独立版/公众号/H5/DIY装修/营销/直播/拼团/秒杀/前端vue全开源代码
  8. 解决本地请求跨域问题,替换代理,Whistle + chrome扩展工具SwitchyOmega
  9. 马云除了发20亿玩红包,支付宝还干了一件轰动全球的大事儿!
  10. Python第三方库matplotlib(2D绘图库)入门与进阶