哈尔滨网站制作哪家好,通州青岛网站建设,长宁青岛网站建设,石家庄建设局点击蓝字关注我们有粉丝问了类似这样的问题#xff1a;while(1) 和 for(;;)它们不都是无限循环吗#xff0c;作用应该一样啊#xff0c;它们到底有什么区别#xff1f;要回答这个问题#xff0c;其实你各自编写一段while(1) 和 for(;;)的代码#xff0c;编译对比一下代码… 点击蓝字关注我们有粉丝问了类似这样的问题while(1) 和 for(;;)它们不都是无限循环吗作用应该一样啊它们到底有什么区别要回答这个问题其实你各自编写一段while(1) 和 for(;;)的代码编译对比一下代码大小和汇编文件你就大概知道了。一、while(1)和for(;;)语法表达这里先说一下while(1)和for(;;)语法表达式。1、while语法表达while( 表达式 )
{语句
}其中表达式是循环条件语句为循环体。while语句的语义是计算表达式的值当值为真(非0)时 执行循环体语句。其执行过程可用下图表示2、for语法表达for(表达式1; 表达式2; 表达式3)
{语句
}它的执行过程如下先求解表达式1求解表达式2若其值为真非0则执行for语句中指定的内嵌语句然后执行下面第3步若其值为假0则结束循环转到第5步。求解表达式3转回上面第2步继续执行。循环结束执行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.cwhile汇编代码; filename: whiles.file while.c.text.globl main.type main, function
main:
.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:.size main, .-main.ident GCC: (GNU) 9.3.0.section .note.GNU-stack,,progbitsfor汇编代码; filename: for.s.file for.c.text.globl main.type main, function
main:
.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:.size main, .-main.ident GCC: (GNU) 9.3.0.section .note.GNU-stack,,progbits你会发现除了文件名不同其余都相同。当然这里额外说一下不同代码、不同编译器以及不同优化等级可能最终结果有所差异。*声明本文于网络整理版权归原作者所有如来源信息有误或侵犯权益请联系我们删除或授权事宜。戳“阅读原文”我们一起进步