原文地址http://bbs.chinaunix.net/thread-2306235-1-1.html
- #include "stdio.h"
- void forTest()
- {
- int num = 1234; // 迭代次数
- long sum = 0; // 保存加法结果
- for(int i=0;i<num;i++) // 传统for循环写法
- {
- sum = sum + i; // 计算结果
- }
- printf("forTest:%d\n",sum);
- }
- void whileTest()
- {
- int num = 1234; // 迭代次数
- long sum = 0; // 保存加法结果
- while((num--)>0)
- {
- sum = sum + num; // 计算结果
- }
- printf("whileTest:%d\n",sum);
- }
- void main()
- {
- forTest();
- whileTest();
- }
whileTest()函数
0040D760~0040D776: 保存栈现场 总共10条指令
0040D778: 迭代次数 总共1条指令
0040D77F: 保存加法结果 总共1条指令
0040D786~0040D79F: while循环 总共10条指令
0040D7A1~0040D7AF: 打印结果 总共5条指令
0040D7B2~0040D7C2: 恢复栈现场 总共9条指令
合计: 36条指令
forTest()函数
0040D3F0~0040D406: 保存栈现场 总共10条指令
0040D408: 迭代次数 总共1条指令
0040D40F: 保存加法结果 总共1条指令
0040D416~0040D439: for循环 总共12条指令
0040D43B~0040D449: 打印结果 总共5条指令
0040D44C~0040D45C: 恢复栈现场 总共9条指令
合计: 38条指令
程序中for循环用的是传统写法,做下更改将for(int i=0;i<num;i++)改为for(;(num--)>0;)
0040D3F0~0040D406: 保存栈现场 总共10条指令
0040D408: 迭代次数 总共1条指令
0040D40F: 保存加法结果 总共1条指令
0040D416~0040D42F: for循环 总共10条指令
0040D431~0040D43F: 打印结果 总共5条指令
0040D442~0040D452: 恢复栈现场 总共9条指令
合计: 36条指令
由此可见,for循环习惯写法for(int i=0;i<num;i++)执行效率低于for(;(num--)>0;)写法,而for(;(num--)>0;)写法执行效率与while((num--)>0)相同.
一般来说,do..while循环要比for,while循环的效率要高,这点可以从你做过的汇编分析中看出,而且在深入理解计算机一书的第三章3.6.5节中的讲述也可以看出在对上述循环语句进行汇编时,会先将for,while转换为do..while。