while(1) 和 for(;;)它们不都是无限循环吗,作用应该一样啊,它们到底有什么区别?
要回答这个问题,其实你各自编写一段while(1) 和 for(;;)的代码,编译对比一下代码大小和汇编文件,你就大概知道了 。
# while(1)和for(;;)语法表达
这里先说一下while(1)和for(;;)语法表达式 。
1.while语法表达
while( 表达式 ){语句}
其中:
- 表达式:是循环条件
- 语句:为循环体 。
文章插图
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;}
【1 从汇编层告诉你while 和 for(;;)有什么区别?】2.生成汇编
我们这里使用gcc编译器生成汇编,执行命令如下:
gcc -S -o while.s while.cgcc -S -o for.s for.c
while汇编代码:
; filename: whiles.file"while.c".text.globlmain.typemain, @functionmain:.LFB0:.cfi_startprocpushq%rbp.cfi_def_cfa_offset 16.cfi_offset 6, -16movq%rsp, %rbp.cfi_def_cfa_register 6movl%edi, -4(%rbp)movq%rsi, -16(%rbp).L2:jmp.L2.cfi_endproc.LFE0:.sizemain, .-main.ident"GCC: (GNU) 9.3.0".section.note.GNU-stack,"",@progbits
for汇编代码:
; filename: for.s.file"for.c".text.globlmain.typemain, @functionmain:.LFB0:.cfi_startprocpushq%rbp.cfi_def_cfa_offset 16.cfi_offset 6, -16movq%rsp, %rbp.cfi_def_cfa_register 6movl%edi, -4(%rbp)movq%rsi, -16(%rbp).L2:jmp.L2.cfi_endproc.LFE0:.sizemain, .-main.ident"GCC: (GNU) 9.3.0".section.note.GNU-stack,"",@progbits
你会发现,除了文件名不同,其余都相同 。
当然,这里额外说一下,不同代码、不同编译器,以及不同优化等级,可能最终结果有所差异 。
推荐阅读
- 崂山红茶,崂山红茶的功效与作用
- 手机游戏|职场从来都不是平静如水,人际交往要清理,社交中提防这几类人
- 从里到外焕然一新!win11新版“多开桌面”功能,比win10好用!
- 华为交换机配置跨网段通过vlanif通信,二层隔离三层通信
- 从根本上解决Github打不开的问题
- 从婚姻线看“桃花”情结
- 从腰相看富贵财运
- 如何分辨茶叶的好坏?
- 土耳其红茶茶叶形状,红茶在土耳其的历史
- 孩子多大分床睡比较好