IE盒子

搜索
查看: 121|回复: 0

怎么用C语言实现循环?

[复制链接]

3

主题

5

帖子

11

积分

新手上路

Rank: 1

积分
11
发表于 2023-4-26 19:45:12 | 显示全部楼层 |阅读模式
在C语言程序中,一共有三种程序结构:顺序结构、选择结构(分支结构)、循环结构;顺序结构,从头到尾一句接着一句的执行下来,直到执行完最后一句;选择结构,到某个节点后,会根据一次判断的结果来决定之后向哪一个分支方向执行; 循环结构,循环结构有一个循环体,循环体里是一段代码。对于循环结构来说,关键在于根据判断的结果,来决定循环体执行多少次。C语言循环控制语句是一个基于C语言的编程语句,该语句主要有while循环语句、do-while循环语句和for循环语句来实现循环结构。
我相信这个问题很多人都遇到过,就是当for 循环结束后 i 的值到底是多少不是很确定,在这个问题上犯难,是在不值得。如果你也曾有过这种疑问,那么这篇文章就很值得继续看下去。

这篇文章将拨开迷雾,让你看到循环的本质。

这篇文章主要谈一下C中的这些循环, 跳转语句的内部实现机制。通过深入了解他们的内在,将让你在编程的时候逻辑更加清晰,出现问题的时候也更容易排查。

注:这篇文章中会涉及到一些基本的汇编知识,我们将通过分析 for 、 while 、 do—while 等的汇编表示形式,来弄清楚他们的实现机理。

if–else

if–else是基本的条件转移控制指令,也可以说是程序循环跳转实现的基础。



先看一个具体的例子,函数absdiff()比较两个参数x,y 的大小,返回他们差的绝对值。

我们创建了对于的C语言版本(a)、goto形式的版本(b)、 以及其对应的汇编形式(c):

创建goto版本是为了能更好的理解他的汇编形式。因为里面的goto语句很类似于汇编中的跳转语句。

(a)中 的C代码应该不用多做解释了吧,大家应该都能看懂。

(b)中的got0语句形式:第4 行是一个跳转语句,跳转到执行第8 行。也就是说当第3 行的条件满足的时候,跳转到第8 行执行。如果第3 行的条件不满足,则执行第 5 行的语句。 然后无条件跳转到代码的结尾:“ goto done;” 使用goto 语句通常被认为是一种不好的 编程风格,因为这样的语句通常难于调试和阅读,这里使用goto语句是为了构造出一种类似汇编实现的C语句。



(c)就是我们要讨论的重点了。其实条件跳转指令的汇编形式和他的goto形式有一定的相似之处。有语句跳转的时候都是这样的过程:先判断是否满足某个条件,如果满足,则跳到一个指定的的代码段继续执行程序,如果不满足,则执行另一条语句。

为了弄清楚它内部是如何实现的,现在我们来详细看一下他的汇编指令形式(c)

程序的 1 、2 行取得x y 的值。放在寄存器 edx eax 中,第三行比较x y 的大小(也就是比较edx eak 的大小)如果x > y 则跳到 .L2的地方执行(8 、9 行)执行x - y ,并将结果放在返回值中,然后程序顺序执行到程序结束处 .L3,反之,如果第三行判断结果是x<y ,则语句不会跳转,顺序执行y-x,并跳转到程序结束处 .L3.

现在,我们基本了解if --else 的执行机理了。主要是先判断条件值,从这个例子出发就是第 3 条语句: cmpl %eax,%edx。学过汇编的同学应该知道,cmpl是一条比较指令,他的执行会影响标志位。做个简单的假设: cmpl A,B 是比较A,B两个数的大小,比较结果存放在标志位 F 中,当A>B时,F为0,A<BF为1。 后面的jge .L是跳转语句,他的执行是和上一步比价的结果相关的,这里也就反映在标志位F 当中。当F 为1时(A<B),则跳转到 .L2执行 B-A。当比较结果为A>B 查看后标志位为0,则jge不跳转, 程序继续往下执行。
嵌入式物联网需要学的东西真的非常多,不少人因为学的路线不对、内容不对头而和高薪offer擦肩而过,甚至有些老铁压根都不知道要学什么……让人捉急……
分享一波自己整理的学习资源吧,基本上要学的内容都有,150多G。点击这里找小助理0元领取:
今天我的分享就到这里了~希望能对你有帮助!别忘了点关注和赞同哟~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表