C语言循环的实现
在C语言中采用3中语法来实现循环,它们分别是while、for、do while,本文将分别说明这三种循环的实现,并对它们的运行效率进行比较。
do while
首先来看do while的实现:下面是简单的代码:
int nCount = 0;
int nMax = 10;
do
{
nCount++;
} while (nCount < nMax);
return 0;
下面对应的是它的汇编代码:
9: int nCount = 0;
00401268 mov dword ptr [ebp-4],0
10: int nMax = 10;
0040126F mov dword ptr [ebp-8],0Ah
11: do
12: {
13: nCount++;
00401276 mov eax,dword ptr [ebp-4]
00401279 add eax,1
0040127C mov dword ptr [ebp-4],eax
14: } while (nCount < nMax);
0040127F mov ecx,dword ptr [ebp-4];exc = nCount
00401282 cmp ecx,dword ptr [ebp-8];比较nCount 和 nMax的值
00401285 jl main+26h (00401276);跳转到循环体中
15: return 0;
00401287 xor eax,eax
在汇编代码中首先执行了一次循环体中的操作,然后判断,当条件满足时会跳转回循环体,然后再次执行,当条件不满足时会接着执行后面的语句。
这个过程可以用goto来模拟:
int nCount = 0;
int nMax = 10;
__WHILE:
nCount++;
if(nCount < nMax)
goto __WHILE;
while循环
不同于do while的先执行再比较,while采取的是先比较再循环的方式,下面是一个while的例子:
int nCount = 0;
int nMax = 10;
while (nCount < nMax)
{
nCount++;
}
00401268 mov dword ptr [ebp-4],0
10: int nMax = 10;
0040126F mov dword ptr [ebp-8],0Ah
11: while (nCount < nMax)
00401276 mov eax,dword ptr [ebp-4]
00401279 cmp eax,dword ptr [ebp-8]
0040127C jge main+39h (00401289)
12: {
13: nCount++;
0040127E mov ecx,dword ptr [ebp-4]
00401281 add ecx,1
00401284 mov dword ptr [ebp-4],ecx
14: }
00401287 jmp main+26h (00401276)
15: return 0;
00401289 xor eax,eax
从汇编代码上可以看出,执行while循环时会有两次跳转,当条件不满足时会执行一次跳转,跳转到循环体外,而条件满足,执行完一次循环后,会再次跳转到循环体中,再次进行比较。相比于do while来说,while执行了两次跳转,效率相对较低。
for 循环
for循环是首先进行初始化操作然后进行比较,条件满足时执行循环,再将循环变量递增,最后再次比较,执行循环或者跳出。下面是for的简单例子:
int nMax = 10;
for (int i = 0; i < nMax; i++)
{
printf("%d\n", i);
}
下面是它对应的汇编代码:
9: int nMax = 10;
00401268 mov dword ptr [ebp-4],0Ah
10: for (int i = 0; i < nMax; i++)
0040126F mov dword ptr [ebp-8],0 ;初始化循环变量
00401276 jmp main+31h (00401281);跳转到比较操作处
00401278 mov eax,dword ptr [ebp-8]
0040127B add eax,1
0040127E mov dword ptr [ebp-8],eax;这三句话实现的是循环变量自增操作
00401281 mov ecx,dword ptr [ebp-8];ecx = i
00401284 cmp ecx,dword ptr [ebp-4];比较ecx与i
00401287 jge main+4Ch (0040129c);跳转到循环体外
11: {
12: printf("%d\n", i);
00401289 mov edx,dword ptr [ebp-8]
0040128C push edx
0040128D push offset string "%d\n" (0042e01c)
00401292 call printf (00401540)
00401297 add esp,8
13: }
0040129A jmp main+28h (00401278);跳转到i++位置
14: return 0;
0040129C xor eax,eax
从上面的汇编代码可以看出for循环的效率最低,它经过了3次跳转,生成对应的汇编代码上,初始化操作后面紧接着是循环变量自增操作,所以首先在完成初始化后会进行一次跳转,跳转到判断,然后根据判断条件再次跳转或者接着执行循环体,最后当循环完成后会再次跳转到循环变量自增的位置,同样采用goto语句来模拟这个操作:
int nMax = 10;
int i = 0;
goto __CMP;
__ADD:
i++;
__CMP:
if (i >= nMax)
{
goto __RETURN;
}
__LOOP:
printf("%d\n", i);
goto __ADD;
__RETURN:
return 0;
continue语句
continue用于结束这次循环进入下一次循环,下面采用最复杂的for循环来说明continue语句:
int nMax = 10;
int i = 0;
for(;i < nMax; i++)
{
if (i == 6)
{
continue;
}
}
下面是它对应的汇编代码:
00401268 mov dword ptr [ebp-4],0Ah
10: int i = 0;
0040126F mov dword ptr [ebp-8],0
11: for(;i < nMax; i++)
00401276 jmp main+31h (00401281)
00401278 mov eax,dword ptr [ebp-8]
0040127B add eax,1
0040127E mov dword ptr [ebp-8],eax
00401281 mov ecx,dword ptr [ebp-8]
00401284 cmp ecx,dword ptr [ebp-4]
00401287 jge main+43h (00401293)
12: {
13: if (i == 6)
00401289 cmp dword ptr [ebp-8],6;
0040128D jne main+41h (00401291);条件不满足组跳转到循环结束处
14: {
15: continue;
0040128F jmp main+28h (00401278)
16: }
17: }
00401291 jmp main+28h (00401278)
18: return 0;
00401293 xor eax,eax
从上面的汇编代码可以看到,continue语句也是一个跳转语句,它会直接跳转到循环体的开始位置。对于for来说相对特殊一些(我觉得循环变量自增并不属于循环体),由于第一次进入循环时并没有执行循环变量自增,所以它会跳转到循环变量自增的位置,其他则直接到循环开始处。
C语言循环的实现的更多相关文章
- Go语言循环判断的使用~
Go 语言条件语句 条件语句需要开发者通过指定一个或多个条件,并通过测试条件是否为 true 来决定是否执行指定语句,并在条件为 false 的情况在执行另外的语句. 下图展示了程序语言中条件语句的结 ...
- R语言 循环
R语言循环 可能有一种情况,当你需要执行一段代码几次. 通常,顺序执行语句. 首先执行函数中的第一个语句,然后执行第二个语句,依此类推. 编程语言提供允许更复杂的执行路径的各种控制结构. 循环语句允许 ...
- C语言-循环结构及break、continue
循环结构 --1-- 结构循环 1.1 while循环 1.2 do…while循环 1.3 for循环 --2-- break和continue 2.1 break关键字 2.2 continue关 ...
- go语言循环语句 for
Go语言中的循环语句只支持for关键字,而不支持while和do-while结构. sum := 0 for i := 0; i < 10; i++ { sum += i } 无限循环的写法: ...
- C语言循环的嵌套
注:参考网络资源拟制,如雷同请见谅循环的嵌套:一个循环体语句中又包含另一个循环语句,称为循环嵌套.嵌套注意事项:1.使用循环嵌套时,内层循环和外层循环的循环控制变量不能相同.2.循环嵌套结构的书写,最 ...
- 08-C语言循环
目录: 一.for循环 二.break,continue 三.循环嵌套 四.while 五.do while 六.三个循环的对比 七.空语句 回到顶部 一.for循环 标识每次循环,循环终止条件,循环 ...
- Go 语言循环语句
在不少实际问题中有许多具有规律性的重复操作,因此在程序中就需要重复执行某些语句. 以下为大多编程语言循环程序的流程图: Go 语言提供了以下几种类型循环处理语句: 循环类型 描述 for 循环 重复执 ...
- c语言循环案例
do while #include <stdio.h> #include <stdlib.h> int main() { int a = 1,b = 10; do { b -= ...
- GO语言学习(十一)Go 语言循环语句
Go 语言提供了以下几种类型循环处理语句: 循环类型 描述 for 循环 重复执行语句块 循环嵌套 在 for 循环中嵌套一个或多个 for 循环 语法 Go语言的For循环有3中形式,只有其中的一种 ...
随机推荐
- linux 开机批量启动程序
每天早上到公司第一件事打开电脑,打开我的qq.我的开发工具idea.在看看邮件,日复一日,变懒了.也变聪明了,写了以下一段脚本 文件名称:mystart.sh #!bin/bash #检验我的开发工具 ...
- LeetCode OJ 之 Ugly Number II (丑数-二)
题目: Write a program to find the n-th ugly number. Ugly numbers are positive numbers whose prime fact ...
- 用node.js实现mvc相册资源管理器
摘要:通过前两天的学习我大概学了了,用formidable模块文件上传,express框架,以及利用fs模块进行文件读取,今天我学习了如何用这些知识来制作相册,暂没有数据库,所以做的也是本地的资源管理 ...
- 项目实战12.1—企业级监控工具应用实战-zabbix安装与基础操作
无监控,不运维.好了,废话不多说,下面都是干货. 警告:流量党勿入,图片太多!!! 项目实战系列,总架构图 http://www.cnblogs.com/along21/p/8000812.html ...
- dedecms在php7下的使用方法,织梦dedecsm后台一片空白的解决方法
前几天,一个老客户,最近升级了服务器,php到php7,把织梦dedecms转移到新服务器后,不能登录后台,让帮忙看一下. 我看了下他们的网站,使用的是织梦V57_UTF8_SP1前台页面是可以访问的 ...
- do {...} while (0) 在宏定义中的作用
如果你是一名C程序员,你肯定很熟悉宏,它们非常强大,如果正确使用可以让你的工作事半功倍.然而,如果你在定义宏时很随意没有认真检查,那么它们可能使你发狂,浪费N多时间.在很多的C程序中,你可能会看到许多 ...
- Javascript之模拟文字高亮
在我们平时浏览网页的时候,我们常常会用到Ctrl+F(搜索)功能,被搜索到的文字就是高亮显示.那么,如何在Javascript中模拟文字高亮显示这一功能呢? 以下为笔者写的样例代码: <!DOC ...
- iOS 正则表达式使用(转)
1/ 教程一:认识正则表达式 .http://deerchao.net/tutorials/regex/regex.htm#mission 表7.尚未详细讨论的语法 代码/语法 说明 \a 报警字符( ...
- Pytorch windows10安装教程
强烈建议安装anaconda之后再来安装这个pytorch,具体怎么安装百度搜索就知道了. 温馨提示,在安装anaconda的时候记得将"添加到环境变量"(安装的时候是英文的)这一 ...
- [Upper case conversion ] 每个单词的首小写字母转换为对应的大写字母
Given a string , write a program to title case every first letter of words in string. Input:The firs ...