有读者提出了类似这样的问题: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
你会发现,除了文件名不同,其余都相同。
当然,这里额外说一下,不同代码、不同编译器,以及不同优化等级,可能最终结果有所差异。
新型DDR5内存的应用
城中村无线视频监控系统方案
IBM CEO 罗睿兰:我预计人工智能将在未来5到10年内改变100%的工作
OPPO全链路色彩管理系统将于11月18日正式登场
电脑和手机的内存不足怎么办
while(1)和 for(;;)有什么区别
谷歌:AIY计划的首个参考平台--Voice Kit,DIY自己的AI人工智能产品
电压等级划分及适用范围
央行副行长就约谈蚂蚁集团答记者问
OrCAD Capture CIS instance和occurrences概念解析
Bose发布Lifestyle 550家庭娱乐系统,无线低音箱、蓝牙和Wi-Fi连接
AR工业方案_AR+工业对传统制造业转型有什么优势?
微软Surface Go继任者现身跑分库
不同材料的电池性能比较
ROHM确立150V耐压GaN器件量产体制 Danfoss在中国量产电机
SK海力士宣布量产世界最高238层4D NAND闪存
关于三大运营商在400G网络上的发展成果
光敏三极管控制的语言电路
螺杆支撑座使用深沟球轴承和角接触球轴承的区别?
新能源 | “中美贸易战”升级对新能源电池行业的影响