0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

奈因PCB电路板设计 来源:strongerHuang 作者:strongerHuang 2021-08-11 10:34 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

有读者提出了类似这样的问题:while(1) 和 for(;;) 它们不都是无限循环吗,作用应该一样啊,它们到底有什么区别?

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

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

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

1.while语法表达

while( 表达式 ){ 语句}

其中:

表达式:是循环条件

语句:为循环体。

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

2.for语法表达

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

它的执行过程如下:

1.先求解表达式1

2.求解表达式2

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

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

3.求解表达式3

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

5.循环结束,执行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

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

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

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C语言
    +关注

    关注

    183

    文章

    7646

    浏览量

    146139
  • 编程
    +关注

    关注

    90

    文章

    3723

    浏览量

    97434
  • 代码
    +关注

    关注

    30

    文章

    4976

    浏览量

    74376

原文标题:while(1) 和 for ( ; ; )有什么区别?

文章出处:【微信号:pcbgood,微信公众号:奈因PCB电路板设计】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Boost、Buck-Boost、Sepic拓扑什么区别

    工程师们在做电源设计时经常会有升压的需求,而常用的Boost、Buck-Boost、Sepic拓扑均可实现升压。这些拓扑什么区别,该选哪个呢?
    的头像 发表于 04-11 14:14 998次阅读
    Boost、Buck-Boost、Sepic拓扑<b class='flag-5'>有</b><b class='flag-5'>什么区别</b>

    如何电源管理电池供电和线路供电系统之间什么区别

    如何电源管理电池供电和线路供电系统之间什么区别
    发表于 04-06 08:24

    请问TJA1028DT/0 和 TJA1028x/5/20 什么区别

    TJA1028DT/0 和 TJA1028x/5/20 什么区别
    发表于 03-20 07:41

    行星减速机与齿轮减速机什么区别

    行星减速机与齿轮减速机什么区别
    的头像 发表于 01-04 16:30 1793次阅读
    行星减速机与齿轮减速机<b class='flag-5'>有</b><b class='flag-5'>什么区别</b>?

    武汉芯源MCU和英飞凌MCU什么区别

    武汉芯源MCU和英飞凌MCU什么区别
    发表于 12-11 06:26

    MCU不同封装都什么区别

    目前MCU不同封装都什么区别
    发表于 12-01 06:41

    请问jtag和jlink什么区别啊?

    jtag和jlink什么区别啊?
    发表于 11-28 06:46

    高压探棒和高压差分探头什么区别

    我们在使用功率放大器放大信号,或是需要检测信号的时候,可能都会用到这样一个测试测量设备,那就是高压探棒和高压差分探头,那么你知道高压探棒和高压差分探头什么区别吗?一、高压探棒和差分探头的基本概念
    的头像 发表于 11-19 08:38 689次阅读
    高压探棒和高压差分探头<b class='flag-5'>有</b><b class='flag-5'>什么区别</b>?

    ARM架构与DSP什么区别?哪一个更好?

    ARM架构与DSP什么区别?哪一个更好?
    发表于 11-19 06:14

    微波雷达和毫米波雷达什么区别

    微波雷达和毫米波雷达什么区别 前言:不知道大家有没有发现,各种雷达模块的使用开始逐渐加入各种智能家居产品了,像人来灯亮,人走灯灭这种雷达感应的产品早几年就开始进入市场了,还有各种感应开关等产品
    的头像 发表于 10-30 16:56 2249次阅读
    微波雷达和毫米波雷达<b class='flag-5'>有</b><b class='flag-5'>什么区别</b>

    Re-Driver 和 Re-Timer 什么区别

    Re-Driver 和 Re-Timer 什么区别
    发表于 08-21 06:14

    使用ICP编程工具进行离线编程设置时,启用“使用密码”什么区别

    使用ICP编程工具进行离线编程设置时,启用“使用密码”什么区别
    发表于 08-19 06:04

    请问ST7701和ST7701S什么区别吗?

    ST7701和ST7701S什么区别
    发表于 07-22 08:16

    请问CYW2019B2的SPI1与SPI2什么区别

    请问: CYW2019B2的SPI1与SPI2什么区别?SPI接口工作于Slave方式,接收外设的数据。如果设为SPI1可以正常工作;设为SPI2也可以接收全部数据,但是顺序不对,请
    发表于 07-08 07:51

    sd-wan组网方案和woc设备有什么区别

    SD-WAN组网方案和WOC(广域网优化控制器)设备是解决企业广域网(WAN)问题的两种不同技术路线,它们的目标部分重叠(提升性能、降低成本),但核心原理、实现方式和侧重点显著区别,主机推荐小编为您整理发布sd-wan组网方案和woc设备有
    的头像 发表于 06-03 11:21 1205次阅读
    sd-wan组网方案和woc设备有<b class='flag-5'>什么区别</b>