while(1) 和 for(;;) 有什么区别?

admin 2022年1月9日04:08:54安全开发评论15 views1972字阅读6分34秒阅读模式


while(1) 和 for(;;) 有什么区别?
这是「进击的Coder」的第 551 篇技术分享
作者:strongerHuang
来源:嵌入式专栏

阅读本文大概需要 5 分钟。



有读者问题了类似这样的问题: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.cint main(int argc, char const *argv[]){    while(1)    {}
return 0;}

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

2.生成汇编
我们这里使用 gcc 编译器生成汇编,执行命令如下:
gcc -S -o while.s while.cgcc -S -o for.s for.c

while 汇编代码:
; filename: whiles  .file  "while.c"  .text  .globl  main  .type  main, @functionmain:.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, @functionmain:.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

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

当然,这里额外说一下,不同代码、不同编译器,以及不同优化等级,可能最终结果有所差异。
while(1) 和 for(;;) 有什么区别?

End

崔庆才的新书《Python3网络爬虫开发实战(第二版)》已经正式上市了!书中详细介绍了零基础用 Python 开发爬虫的各方面知识,同时相比第一版新增了 JavaScript 逆向、Android 逆向、异步爬虫、深度学习、Kubernetes 相关内容,‍同时本书已经获得 Python 之父 Guido 的推荐,目前本书正在七折促销中!

内容介绍:《Python3网络爬虫开发实战(第二版)》内容介绍


while(1) 和 for(;;) 有什么区别?


扫码购买


while(1) 和 for(;;) 有什么区别?



好文和朋友一起看~

原文始发于微信公众号(进击的Coder):while(1) 和 for(;;) 有什么区别?

特别标注: 本站(CN-SEC.COM)所有文章仅供技术研究,若将其信息做其他用途,由用户承担全部法律及连带责任,本站不承担任何法律及连带责任,请遵守中华人民共和国安全法.
  • 我的微信
  • 微信扫一扫
  • weinxin
  • 我的微信公众号
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年1月9日04:08:54
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                  while(1) 和 for(;;) 有什么区别? http://cn-sec.com/archives/728116.html

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: