免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: accelerator
打印 上一主题 下一主题

do-while(0)的宏定义似乎没存在的必要. [复制链接]

论坛徽章:
0
21 [报告]
发表于 2007-06-22 20:55 |只看该作者
原帖由 accelerator 于 2007-6-22 12:19 发表


呵呵, 以前不知道从哪里看到有说
while (1) {
}
的效率没有
for ( ; ; ) {
}
高, 今天特意比较了一下编译结果, 也是一样的

所有的循环语句编译成汇编后都是do while()形式

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
22 [报告]
发表于 2007-06-22 22:58 |只看该作者
原帖由 zx_wing 于 2007-6-22 20:55 发表

所有的循环语句编译成汇编后都是do while()形式

呵呵,这个看最后生成的汇编最直观了。

论坛徽章:
0
23 [报告]
发表于 2007-06-23 16:02 |只看该作者
原帖由 zx_wing 于 2007-6-22 20:55 发表

所有的循环语句编译成汇编后都是do while()形式


do while 循环至少循环体要执行一次。

但 while  和 for 可以一次都不执行循环体的。

论坛徽章:
0
24 [报告]
发表于 2007-06-23 16:12 |只看该作者
jmp

原帖由 zx_wing 于 2007-6-22 20:55 发表

所有的循环语句编译成汇编后都是do while()形式

论坛徽章:
0
25 [报告]
发表于 2007-06-23 18:19 |只看该作者
原帖由 VirusCamp 于 2007-6-23 16:02 发表


do while 循环至少循环体要执行一次。

但 while  和 for 可以一次都不执行循环体的。

这里的意思是指循环的汇编代码直译成c代码后都是do while()形式。汇编中循环的格式译成c大多都是如下格式:

  1. loop:
  2.   exp = 判断条件
  3. if (!exp)
  4.    goto done
  5.   循环体代码
  6. goto loop
  7. done:
  8.    …………
复制代码

当然这是说x86上的,很多更先进的架构是有循环寄存器的,代码格式也不相同了

[ 本帖最后由 zx_wing 于 2007-6-23 18:43 编辑 ]

论坛徽章:
0
26 [报告]
发表于 2007-06-24 14:19 |只看该作者
while循环编译后肯定都是jmp, 问题的关键是, 向while(0), while(1), if(0), if(1)这类语句是编译时刻计算还是推迟到运行时刻计算, C标准中有规定么? 虽然GCC都是在编译时把判断抹掉.

论坛徽章:
0
27 [报告]
发表于 2007-06-25 08:44 |只看该作者
难道do{}while(0);不是为了方便使用break随时跳出而存在的么?

论坛徽章:
1
15-16赛季CBA联赛之四川
日期:2016-02-15 17:12:32
28 [报告]
发表于 2007-06-25 11:09 |只看该作者
#define AAA { if(1) xxx else xxx;if(1) xxx else xxx;}
如果不用do{} whlie(0)
if (xxx)  AAA; //这里就是{ if(1) xxx else xxx;if(1) xxx else xxx;}; 是两条语句了
else xxx;

论坛徽章:
0
29 [报告]
发表于 2007-06-26 09:29 |只看该作者
用do{}while(0) ,不用{},是为了实际调用时候后的分号

论坛徽章:
0
30 [报告]
发表于 2007-06-26 10:04 |只看该作者
学习
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP