您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

从汇编层告诉你while(1) 和 for(;;)有什么区别?

时间:2022-01-25 09:35:38  来源:  作者:IT三宝

while(1) 和 for(;;)它们不都是无限循环吗,作用应该一样啊,它们到底有什么区别?

要回答这个问题,其实你各自编写一段while(1) 和 for(;;)的代码,编译对比一下代码大小和汇编文件,你就大概知道了。

# while(1)和for(;;)语法表达

这里先说一下while(1)和for(;;)语法表达式。

1.while语法表达

while( 表达式 )
{
  语句
}

 

其中:

  • 表达式:是循环条件
  • 语句:为循环体。

while语句的语义是:计算表达式的值,当值为真(非0)时, 执行循环体语句。其执行过程可用下图表示:

从汇编层告诉你while(1) 和 for(;;)有什么区别?

 

2.for语法表达

for(表达式1; 表达式2; 表达式3) 
{
  语句
}

 

它的执行过程如下:

 

1.先求解表达式1

2.求解表达式2

若其值为真(非0),则执行for语句中指定的内嵌语句,然后执行下面第3)步;

若其值为假(0),则结束循环,转到第5)步。

3.求解表达式3

4.转回上面第2)步继续执行。

5.循环结束,执行for语句下面的一个语句。

执行过程可用下图表示:

从汇编层告诉你while(1) 和 for(;;)有什么区别?

 

# while(1)和for(;;)异同点

 

这里先说一下结论,然后再验证验证结论。

 

1.相同点

 

作用和效果都一样:都是实现无限循环的功能。

 

2.不同点

 

while(1):其中括号里面是一个条件,程序会判断真假。而括号里面的“1”永远是一个“真值”。

其中,每一次循环,编译器都要判断常量1是不是等于零。

for(;;):这两个;;空语句,编译器一般会优化掉的,直接进入死循环。

根据上面的描述,你可能会觉得:while(1) 比 for(;;) 要做更多事,汇编代码更多,代码量也更大。

但事实是这样吗?下面验证一下。

# 验证while(1)和for(;;)差异

我们编写分别两个文件for.c和while.c,然后分别生成汇编代码,看下情况。

1.源代码

while.c:

// filename: while.c
int main(int argc, char const *argv[])
{
    while(1)
    {}




    return 0;
}

for.c:

// filename: for.c
int main(int argc, char const *argv[])
{
    for(;;)
    {}




    return 0;
}

 

2.生成汇编

 

我们这里使用gcc编译器生成汇编,执行命令如下:

gcc -S -o while.s while.c
gcc -S -o for.s for.c

 

while汇编代码:

; filename: whiles
  .file  "while.c"
  .text
  .globl  main
  .type  main, @function
main:
.LFB0:
  .cfi_startproc
  pushq  %rbp
  .cfi_def_cfa_offset 16
  .cfi_offset 6, -16
  movq  %rsp, %rbp
  .cfi_def_cfa_register 6
  movl  %edi, -4(%rbp)
  movq  %rsi, -16(%rbp)
.L2:
  jmp  .L2
  .cfi_endproc
.LFE0:
  .size  main, .-main
  .ident  "GCC: (GNU) 9.3.0"
  .section  .note.GNU-stack,"",@progbits

 

for汇编代码:

; filename: for.s
  .file  "for.c"
  .text
  .globl  main
  .type  main, @function
main:
.LFB0:
  .cfi_startproc
  pushq  %rbp
  .cfi_def_cfa_offset 16
  .cfi_offset 6, -16
  movq  %rsp, %rbp
  .cfi_def_cfa_register 6
  movl  %edi, -4(%rbp)
  movq  %rsi, -16(%rbp)
.L2:
  jmp  .L2
  .cfi_endproc
.LFE0:
  .size  main, .-main
  .ident  "GCC: (GNU) 9.3.0"
  .section  .note.GNU-stack,"",@progbits

 

你会发现,除了文件名不同,其余都相同。

当然,这里额外说一下,不同代码、不同编译器,以及不同优化等级,可能最终结果有所差异。



Tags:汇编   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
while(1) 和 for(;;)它们不都是无限循环吗,作用应该一样啊,它们到底有什么区别?要回答这个问题,其实你各自编写一段while(1) 和 for(;;)的代码,编译对比一下代码大小和汇编文件,你...【详细内容】
2022-01-25  Tags: 汇编  点击:(3)  评论:(0)  加入收藏
1、机动车驾驶人与登记车主不是一个人的时候,发生交通事故后,责任该怎么承担?根据《侵权责任法》第四十九条的规定,首先由交强险在保险限额内优先承担,不足的部分,原则上有机动车...【详细内容】
2021-05-25  Tags: 汇编  点击:(118)  评论:(0)  加入收藏
我们都知道对于c语言来说,它是需要先转换成汇编语言,然后再生成机器语言的。那么在c语言中,各种条件语句,各种表达式的计算,在汇编中是何如实现的呢?今天我们就来讲解一下。汇编语...【详细内容】
2020-12-10  Tags: 汇编  点击:(105)  评论:(0)  加入收藏
汇编语言的特点明显,其诱人的优点直接导致其严重的缺点, 其“与机器相关”和“执行的高效率”导致其可移植性差和调试难。所以, 我们在选用汇编语言时要根据实际的应用环境,尽...【详细内容】
2020-09-14  Tags: 汇编  点击:(72)  评论:(0)  加入收藏
精选学习计划汇编10篇  时间就如同白驹过隙般的流逝,成绩已属于过去,新一轮的学习生活即将来临,何不用心地制定一个学习计划呢?好的学习计划是什么样的呢?以下是小编为大家收集...【详细内容】
2020-07-22  Tags: 汇编  点击:(136)  评论:(0)  加入收藏
【精选】学习计划汇编5篇  日子在弹指一挥间就毫无声息的流逝,我们的学习又将迈入新的阶段,是时候制定学习计划了哦。可是到底什么样的学习计划才是适合自己的呢?下面是小编...【详细内容】
2020-07-22  Tags: 汇编  点击:(144)  评论:(0)  加入收藏
【精选】学习计划汇编六篇  时间一晃而过,我们又将有新的学习内容,迎来新的挑战,为此需要好好地写一份学习计划了哦。好的学习计划是什么样的呢?以下是小编精心整理的学习计划...【详细内容】
2020-07-22  Tags: 汇编  点击:(170)  评论:(0)  加入收藏
有关学习计划汇编七篇  人生天地之间,若白驹过隙,忽然而已,我们又将迎来新的学习目标,何不用心地制定一个学习计划呢?可是到底什么样的学习计划才是适合自己的呢?下面是小编整理...【详细内容】
2020-07-22  Tags: 汇编  点击:(147)  评论:(0)  加入收藏
【热门】学习计划汇编8篇  时间是箭,去来迅疾,我们又将有新的学习内容,迎来新的挑战,现在就让我们制定一份学习计划,好好地规划一下吧。学习计划怎么写才不会流于形式呢?下面是...【详细内容】
2020-07-22  Tags: 汇编  点击:(149)  评论:(0)  加入收藏
▌简易百科推荐
while(1) 和 for(;;)它们不都是无限循环吗,作用应该一样啊,它们到底有什么区别?要回答这个问题,其实你各自编写一段while(1) 和 for(;;)的代码,编译对比一下代码大小和汇编文件,你...【详细内容】
2022-01-25  IT三宝    Tags:汇编   点击:(3)  评论:(0)  加入收藏
一、摘要在实际的业务开发过程中,我们常常会碰到需要与第三方互联网公司进行技术对接,例如支付宝支付对接、微信支付对接、高德地图查询对接等等服务,如果你是一个创业型互联网...【详细内容】
2022-01-24  DNF搬砖摸金达人    Tags:API接口   点击:(5)  评论:(0)  加入收藏
Swiss Army knife 可以说是本周的关键词了,多个项目采用该词来描述它的特性:像是能全方位解决浏览器“网络”操作的 CyberChef 方便你进行数据加密、解编码,还有帮你处理 JSON...【详细内容】
2022-01-24  HelloGitHub    Tags:GitHub   点击:(4)  评论:(0)  加入收藏
REST API 是当今可用的最常见的 Web 服务类型之一。它们允许包括浏览器应用程序在内的各种客户端通过 REST API 与服务器通信。因此,正确设计 REST API 非常重要,这样我们以后...【详细内容】
2022-01-13  杨同学编程    Tags:API   点击:(16)  评论:(0)  加入收藏
CPU对我们来说既熟悉又陌生,熟悉的是我们知道代码是被CPU执行的,当我们的线上服务出现问题时可能首先会查看CPU负载情况。陌生的是我们并不知道CPU是如何执行代码的,它对我们的...【详细内容】
2022-01-06  小心程序猿QAQ    Tags:代码   点击:(12)  评论:(0)  加入收藏
前言小黑在开发中遇到个问题,我负责的模块需要调用某个三方服务接口查询信息,查询结果直接影响后续业务逻辑的处理;这个接口偶尔会因网络问题出现超时,导致我的业务逻辑无法继续...【详细内容】
2022-01-04  小黑说Java    Tags:接口重试   点击:(25)  评论:(0)  加入收藏
我在会议演讲后经常收到的一个问题很奇怪,不是关于我演讲的内容,而是关于我的Linux桌面环境。人们对这个漂亮的发行版更感兴趣,而不是我刚才做的精彩演示我不是在抱怨,我喜欢我...【详细内容】
2022-01-04  木偶跳舞    Tags:Linux 开发   点击:(24)  评论:(0)  加入收藏
写在前面有时候可能做项目组长,负责一个项目开发,但是工作是内网,也没有公司的版本库权限,那这个时候,我们怎么用处理版本控制,可以用集中式的版本库工具SVN,或者分布式的Git,这里和...【详细内容】
2021-12-31  山河已无恙被注册了    Tags:Git版本库   点击:(47)  评论:(0)  加入收藏
1、什么是YAMLYAML是"YAML Ain’t a Markup Language"(YAML不是一种标记语言)的递归缩写。YAML的意思其实是:“Yet Another Markup Language”(仍是一种标记语言)。主要强度...【详细内容】
2021-12-29  编程菌zfn    Tags:YAML   点击:(23)  评论:(0)  加入收藏
本文分为三个等级自顶向下地分析了glibc中内存分配与回收的过程。本文不过度关注细节,因此只是分别从arena层次、bin层次、chunk层次进行图解,而不涉及有关指针的具体操作。前...【详细内容】
2021-12-28  linux技术栈    Tags:glibc   点击:(28)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条