for 循环和while循环区别

Python基础:If 、While和for 的循环用法及区别 Python里最常用if、while、for语句来实现判断和循环,具体有什么区别呢,以及在使用while和for的时候有没有break的区别是什么呢? 阅读详情

  C语言提供了好几种循环结构,即while、for和do-while。汇编语言中并没有相应的指令存在,作为替代,将条件测试和跳转组合起来实现循环的效果。大多数汇编器根据一个循环的do-while形式来产生循环代码,即使在实际程序中这种形式用的相对较少。其它的循环会首先转换成do-while形式,然后再编译成机器代码。

do-while循环

其通用形式是这样的:

do
    body-statement
while  (test-expr);

  循环的效果就是重复执行body-statement,对test-expr求值,如果求值的结果为非零,就继续循环。注意,body-statement至少执行一次。
  do-while的通用形式可以翻译成如下所示的条件和goto语句:

loop:
    body-statement
    t = test-expr;
    if(t)
      goto loop;

  也就是说每次循环程序会执行循环体里面的语句,然后执行测试表达式。如果测试为真,则回去再执行一次循环。
下面示例用do-while循环计算函数参数的阶乘,写作n!只计算n>0时候n阶乘的值:

int fact_do(int n)
{
    int result = 1;

    do {
        result *= n;
        n = n - 1;
    }while(n > 1);
    return result;
}

这里写图片描述

汇编代码是do-while循环的一个实现形式,这里用的gcc编译器

gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04)

编译参数是

$ gcc -m32 -O2 -o fact

  因为非常不习惯AT&T汇编形式,所以这里用IDA pro 对得到的fact文件进行反汇编分析,原文的汇编形式(用edx保存参数n)我无论怎么调节参数都无法得到。图中是一个do-while循环的标准实现,eax初始化为1,epb+8地址处保存着参数n,0x08048404 处把参数n减一,紧接着0x08048408 处把n与1比较。如果为真则在0x0804840C处跳回循环的开始,这里是循环的关键地方由它来判断循环是继续还是退出。

  综合0x080483F3,0x080483FA我们可以看到eax被初始化为1,在0x080483FD被乘法更新。如果学过x86汇编语言就知道 mul 乘法指令是离不开eax寄存器的,而且返回值通常也用eax寄存器。所以这里eax对应于结果result是无悬念的。

  理解产生的汇编代码与原始代码之间的关系,关键是找到程序值和寄存器之间的映射关系。对于循环fact_do来说,这个任务非常简单,但是对于更复杂的程序来说,就可能是更具挑战性的任务。C语言编译器常常会重组计算,因此有些C代码中的变量在机器代码中没有对应的值;而有时,机器代码中又会引入源代码中不存在的新值。此外编译器还常常试图将多个程序值映射到一个寄存器上,来最小化寄存器的使用率。
  上面的fact_do的过程对于逆向工程循环来说,是一个通用的策略。看看在循环之前如何初始化寄存器,在循环中如何更新和测试寄存器,以及在循环之后又如何使用寄存器。这些步骤中的每一步都提供了一个线索,组合起来就可以解开谜团。做好准备,你会看到令人惊奇的变换,其中有些情况很明显是编译器能够优化的代码,而有些情况很难解释编译器为什么要选用那些奇怪的策略。

while循环

while语句的通用形式如下:

while(test-expr)
   body-statement

  与do-while不同的是,它对test-expr求值,在第一次执行body-statement之前,循环就可能中止。将while循环翻译成机器代码有很多种方法。一种常见的方法,也就是GCC采用的方法,是使用条件分支,在需要时省略循环体的第一次执行,从而将代码转换成do-while循环,如下:

if(!test-expr)
  goto done;
do   
   body-statement
while(test-expr);
done:

  接下来这个代码可直接翻译成goto代码,如下:

    if t = test-expr
    if(!t)
      goto done;
loop:
    body-statement
    t = test-expr;
    if(t)
      goto loop;
done:

  使用这种策略,编译器常常会优化最开始的测试,比如说认为总是满足测试条件。
  举个例子fact_while是使用while循环的阶乘函数的实现,这个函数能正确的计算 0!=1 。fact_while_goto是GCC产生的汇编代码的C语言翻译,比较fact_do 和fact_while 我们看到它们几乎是相同的。将while循环转换成do-while循环,以及将后者翻译成goto代码。

int fact_while(int n)
{
    int result = 1;
    while(n > 1){
        result *= n;
        n = n - 1;
    }
    return result;
}
int fact_while_goto(int n)
{
    int result = 1;
    if(n <= 1)
        goto done;

    loop:
    result *= n;
    n = n - 1;
    if(n > 1)
       goto loop;
    done:
    return result;

}

fact_while反汇编分析

for循环

  for循环的通用形式如下

for(init-expr;test-expr;update-expr)
  body-statement

  C语言标准说明,这样一个循环的行为与下面这段使用while循环代码的行为一样:

init-expr;
while(test-expr) {
    body-statement
    update-expr;
}

  程序首先对初始表达式init-expr求值,然后进入循环;在循环中它先对测试条件test-expr求值,如果测试结果为“假”就会退出,否则执行循环体body-statement;最后对更新表达式update-expr求值。
  这段代码编译后的形式,基于前面讲过的从while到do-while的转换,首先给出do-while的形式:

init-expr;
if(!test-expr)
    goto done;
do{
     body-statement
     update-expr;
}while(test-expr);
done:

  然后将它转换成goto代码:

    init-expr;
    t = test-expr
    if(!t)
        goto done;
loop:
    body-statement
    update-expr;
    t = test-expr;
    if(t)
      goto loop;
done:

  作为一个示例,考虑用for循环写的阶乘函数:

int fact_for(int n)
{
    int i;
    int  result = 1;

    for(i = 2;i <= n; i ++)
        result *= i;
    return result;
}

  如上述代码所示,用for循环编写阶乘函数最自然的方式就是将从2一直到n的因子乘起来,因此这个函数与我们使用while或者do-while循环的代码都不一样。
  这段代码中for循环的不同组成部分如下:

syntaxExpression
init-expri = 2
test-expri <= n
update-expri ++
body-statementresult *= i

  用这些部分带入前面给出的模板中的相应位置,得到下面goto代码的版本:

int fact_for_goto(int n)
{
    int i = 2;
    int result = 1;

    if( !(i <=n ) )
        goto done;

    loop:
    result *= i;
    i ++;
    if(i <= n)
        goto loop;
    done:
    return result;
}

  确实仔细查看GCC产生的汇编代码会发现非常接近如下形式:

这里写图片描述

  综上所述,C语言中三种形式的所有循环— do-while,while和for–都可以用一种简单的策略来翻译,产生包含一个或多个条件分支的代码。控制的条件转移为循环翻译成机器代码提供了基本机制。

死循环选择for还是while

  最后再说一下,看到有人在网上讨论死循环用 for(;;); 好,还是用 while(1); 好。
自己亲自测试了下,在 -O2 参数下它们生成的汇编指令是一样的(看来这应该跟优化配置和编译器选择有很大关系)。
这里写图片描述

倾向得分匹配的stata命令_政策评估方法引荐|广义倾向得分匹配(GPSM) 和大家分享一下最近学习的进展,在痛苦读完stata journal和练习OA程序,已经可以基本完成广义倾向得分的估计了,在国内这一方法还没有形成广泛运用,因此学习资源也是有点稀缺的,在文章最后给各位提供数据和代码以供练习。有问题可以随时文末留言或者联系我哦。人文社会科学中一般无法在实验室中控制样本个体的特征,我们一般采用“准自然实验”的研究路径,也就是不随机安排样本接受处理与否。但放弃随机分组假定... 阅读详情

相关推荐

Claude Code 实战指南:从入门到高效编程

本文是一份Claude Code实战指南,旨在帮助开发者从入门到精通这款AI编程助手。文章详细讲解了如何通过清晰的指令公式与Claude Code高效沟通,并展示了如何将其深度集成到日常开发工作流中,例如理解陌生代码、调试和生成测试文档。指南还提供了避坑建议与最佳实践,并通过构建一个天气查询CLI工具的完整案例,演示了如何利用Claude Code加速开发进程,实现从设计到代码的高效人机协作。

weixin_28339967的博客 484

for循环和while的区别

一、循环的结构不同 for循环的表达式为:for(单次表达式;条件表达式;末尾循环体){中间循环体;}。 while循环的表达式为:while(表达式){循环体}。 二、执行条件的判断方式不同 for循环执行末尾循环体后将再次进行条件判断,若条件还成立,则继续重复上述循环,当条件不成立时则跳出当下for循环。 while循环当满足条件时进入循环,进入循环后,当条件不满足时,执行完循环体内全部语句后再跳出(而不是立即跳出循环)。 三、使用的目的不同 for循环的目的是为了限制循环体的执行次数

qq_47443027的博客 3万+

用scons编译STM32F103工程

想用vscode来实现代码的编辑与调试代码,原先这个工程是用STM32CUBEIDE建立的,参照STM32CUBEIDE的编译过程,编写了下面的scons脚本,scons是初次了解,既然是python脚本,那么会什么就怎么写吧。 import os import sys import glob cross_compiler_prefix = 'arm-none-eabi-' CC = cross_compiler_prefix+'gcc' CXX = cross_compiler_prefix+'g+

cylinc的专栏 1621

while与for循环

while循环 语法: while ( 循环条件 ) { 循环操作/循环体 } 流程图如下: 注意: While是先判断在执行, 编写循环时,明确循环条件和循环操作。 只有当循环条件为true时,才会执行循环操作 注意在循环体中更新循环条件,否则容易造成死循环(条件永远成立) do -- while 循环 语法: do { 循环操作(先执行一次) } while ( 循环条件 ); 流程图如下: 注意: 先执行一遍循环操作,再判...

weixin_44195858的博客 3329

Mixly 数码管时钟

  本文是米思齐数码管图形化编程实验总结分享,走过路过的来看看吧,其中的不足望指出。 一、实验目的及要求 【实验一】实现滚动显示自定义字符串。 【实验二】实现显示自定义时间。 【实验三】实现显示秒表。 二、实验原理与内容 实现米思齐的数码管图形化编程。 三、实验软硬件环境 硬件:Arduino、TM1637数码管 软件:Mixly IDE 四、核心代码及实验效果如下所示 1.实现滚动显示...

weixin_44614199的博客 1647

单片机笔记十二:华大HC32L136超低功耗设计实战

本文详细介绍了华大HC32L136单片机的超低功耗设计实战,包括深度睡眠模式下仅0.5μA的电流消耗、五种功耗模式的对比与配置、外设使用技巧及硬件级优化方法。通过实际项目案例,展示了如何利用ARM Cortex-M0+内核的HC32L136显著延长电池寿命,适用于智能门锁、额温枪等低功耗设备。

weixin_29189373的博客 391

C语言中三种循环语句(while,for,do-whlie)的用法及区别

C语言中比较常见的循环语句就是while,for,do-while这三种了。但是他分别代表什么意思又有什么区别你真的了解了吗?让我们再来重温一下这三种语句和它们的区别吧。

weixin_75260292的博客 1万+

工业视觉检测实战指南:从硬件配置到AI算法部署

本文提供了一套完整的工业视觉检测系统搭建实战指南。从硬件选型(相机、光源、镜头、工控机)到AI算法(深度学习模型)部署,详细解析了如何为生产线配置一双“会思考的眼睛”。重点探讨了深度学习算法在复杂缺陷识别中的应用,并分享了模型训练、优化及云边协同部署的实战心得,旨在帮助工程师实现从实验室Demo到7x24小时稳定运行的工业落地。

weixin_29051193的博客 457

【C语言】while和for循环的详解

1. while循环 2. for循环 3. do-while循环

m0_64364250的博客 8776

Android 编译系统(Build System)剖析

make是一种自动化构建工具,通过读取Makefile将源代码自动编译为可执行程序和库文件。

虎哥LoveDroid 2166

ADC实现模数转换Multisim电路仿真——硬件工程师笔记

8位模数转换器(ADC)是将模拟信号转换为8位数字信号的电子器件,具有256级量化能力。其工作原理分为采样、量化和编码三个阶段,关键参数包括分辨率、采样率、精度、线性度和信噪比。常见型号有ADC0804、ADC0808等,广泛应用于数据采集、音频处理、通信系统和消费电子产品中。典型应用时需要配置参考电压、模拟输入和数字输出引脚,并通过仿真实验验证转换效果(如-10V对应输出0,10V对应255)。硬件工程师需掌握其原理和参数选择,相关笔试面试资料可在优快云博客获取。

XU157303764的博客 1507

循环结构(一)——while语句 与 for语句

我将会用两篇文章讲完循环结构,这是两篇中的第一篇。该篇将介绍whie循环,do while循环和for循环

2301_80030290的博客 2947

10分钟搞定小红书爆款笔记爬取!Selenium模拟登录+数据解析全流程,新手也能落地

小红书爬虫实战的核心,是**“模拟真人操作+解析结构化数据”**——Selenium解决了动态页面和登录的问题,lxml解决了数据提取的问题,pandas解决了数据存储的问题。新手学爬虫不用一开始就啃复杂的反爬机制,先从这类“可见即可爬”的场景入手,掌握“模拟操作→数据解析→数据保存”的全流程,再逐步叠加异常处理、批量爬取、反爬应对等功能。需要注意的是:爬取数据仅用于个人学习和研究,不得用于商业用途,且需遵守小红书的用户协议,不要过度爬取导致服务器压力。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1728

Python for和while循环的区别

Python for和while循环的区别 for循环 1.for循环第一种情况 for x in range(0, 10): print(x) # 结果为0,1,2,3,4,5,6,7,8,9 # 从0开始到9结束 2.for循环第二种情况 for x in range(0, 10, 2): print(x) # 结果为0,2,4,6,8 # 从0开始到9结束,依次加2 3.for循环第...

Mr_Zhen的博客 9044

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

while、for和do...while循环的认识和区别

while、for和do…while循环的认识和区别 文章目录while、for和do...while循环的认识和区别三种循环的认识while循环for循环OK!区别在这里,已经不用回顾的同学请看这里~~~~~~~~~~~~一:二: 三种循环的认识 while循环 语法结构: while (布尔表达式) { 循环体; } 在循环刚开始时,会计算一次“布尔表达式”的值,若条件为真,执行循环体。而对于后来每一次额外的循环,都会在开始前重新计算一次。 语句中应有使循环趋向于结束的语句,否则会出现无限循环–––

qq_43673096的博客 3238

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

C++中for循环和while循环的区别

C++中for循环和while循环的区别 这两者之间最大的区别就是for循环一般应用于循环次数已知的情况,而while循环一般应用于循环次数未知的情况。在一般情况下,这两者是可以相互转化的。 举一个简单的例子:求1-100的和。 #include<bits/stdc++.h> using namespace std; int main(){ int sum=0; for(int i=1;i<=100;i++){ sum+=i; } cout<<sum; } 这个

weixin_45741610的博客 3444

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

while循环和for循环的区别

/* while循环和for循环的区别? 使用区别:如果你想在循环结束后,继续使用控制条件的那个变量,用while循环,否则用for循环。不知道用for循环。 因为变量及早的从内存中消失,可以提高内存的使用效率。 其实还有一种场景的理解: 如果是一个范围的,用for循环非常明确。 如果是不明确要做多少次,用while循环较为合适。 ...

zhengzhongz的博客 3353

python中关于while循环和for循环的区别思考

#python day02 while循环和for循环区别在哪里? 一般在使用循环时,知道执行次数的时候一般用for,条件循环时一般用while。for循环可以设置次数,while循环条件满足没有次数限制。 两种循环在构造死循环时的区别: while循环里的条件被看成表达式,因此,当用while构造死循环时,里面的TRUE实际上被看成永远为真的表达式,这种情况容易产生混淆,有些工具软件就会认为出错了,因此构造死循环时,最好使用for来进行。 两种循环在普通循环时的区别: 对一个数组进行循环时,一般来

木星 5941

Python中for循环和while循环有什么区别?

for循环和while循环有什么区别?众做周知,循环是Python中最基础也是最常见的知识点之一,下面我们来一起好好学习一下for循环和while循环,并对比分析两者的使用区别,帮助Python初学者可以更好地掌握两者的内容和应用,下面一起来看看吧~

m0_59236602的博客 5405

while循环和for循环与它们的区别

一、while循环与if语句有些类似,检查布尔类型的真假,与if不同的是它会循环执行,执行一次后会重复执行,直到执行到假为止,而while Ture是在不知道结果时给的一个条件,作为大部分不知道结果的语句应用。 二、for循环可以遍历任何序列的项目,比如字符串、列表、元组、字典、集合等序列类型,逐个获取序列中的各个元素,需要在执行所得结果后在代码后加上终止语句,break或comtinie。 三、对比for循环和while循环,两者在使用else上有很大区别,如果else语句和while循环语句一起使用

qq_63798218的博客 8423

Java基础之for循环和while循环区别

class ForTest { public static void main(String[] args) { /* 用for完成累加。 */ int sum = 0; for(int x=1; x<=10; x++) { sum = sum + x; } System.out.println("sum="+sum); /* for和while的特点: 1,for和while可以互换。 2,格式上的不同,在使用上有点小区别。

独狼的博客 5501

for循环和while循环的区别

当知道执行次数的时候一般用for 当条件循环时一般用while 例如: for i=0,i<n,i++ {} 这里n是已知数,可以循环n次 while i<n {} 不知道要循环多少次,但当i>=n的时候停止循环 do while循环总会执行一次,for不一定, 一般来说,for对于初学使用的要多于while,但其实while的功能要大于for,以后你慢慢会体会到的,所有的for循环都可以用while来表示,但就不是所有的while循环都可以用for循环来表示! while的用途有时候比

Hfeidz的博客 1万+

C语言for循环和while循环的区别

文章目录1、for循环介绍2、while循环介绍3、循环的选择4、版权声明 1、for循环介绍 for循环的一般形式为: for (语句1;表达式;语句2) { 语句块 } 1)for循环开始时,会先执行语句1,而且在整个循环过程中只执行一次语句1。 2)接着判断表达式的条件,如果条件成立,就执行一次循环体中的语句块。 3)语句块执行完后,接下来会执行语句2。 4)重复第2)...

C语言技术网-码农有道 2万+

Java for循环和while循环的区别

Java for循环和while循环的区别 一、两种循环的格式不同: 控制条件语句所控制的那个变量,在for循环结束后,就不能再被访问到了,而while循环结束还可以继续使用,如果你想继续使用,就用while,否则推荐使用for。原因是for循环结束,该变量就从内存中消失,能够提高内存的使用效率。 二、内存角度: while:while循环结束后,任然可以访问循环中的变量(消耗内存); for:for循环结束后,不能访问循环中的变量(节省内存); 三、应用角度: .

weixin_48553717的博客 5524
上一篇: 使用python 修改文件内容
下一篇: 数字电视业务PSI-SI学习系列
xianjian_x
博客等级 码龄14年 231粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值