无限循环while(1) 和 for(;;)有什么区别? |
您所在的位置:网站首页 › 遍历循环和无限循环的区别 › 无限循环while(1) 和 for(;;)有什么区别? |
while(1) 和 for(;;)它们不都是无限循环吗,作用应该一样啊,它们到底有什么区别? while语法表达 while( 表达式 ) { 语句 }其中: 表达式:是循环条件 语句:为循环体。 while语句的语义是:计算表达式的值,当值为真(非0)时, 执行循环体语句。 其执行过程可用下图表示: 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.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; }生成汇编 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_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,"",@progbitsfor汇编代码: ; filename: for.s .file "for.c" .text .globl main .type main, @function main: .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你会发现,除了文件名不同,其余都相同。 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |