When implementing an infinite loop, is there a difference in using while(1) vs for(;;) vs goto (in C)? When implementing an infinite loop, is there a difference in using while(1) vs for(;;) vs goto (in C)? c c

When implementing an infinite loop, is there a difference in using while(1) vs for(;;) vs goto (in C)?


They are equivalent, even if you turn the optimizer off.

Example:

#include <stdio.h>extern void f(void) {    while(1) {        putchar(' ');    }}extern void g(void) {    for(;;){        putchar(' ');    }}extern void h(void) {    z:        putchar(' ');    goto z;}

Compile with gcc -O0 gives equivalent assembly for all 3 functions:

 f: ;  [ EXTERNAL ] ; +00000 00000fb4 80402DE9             stmdb             sp!,{r7,lr} +00004 00000fb8 00708DE2             add               r7,sp,#0x0 +00008 00000fbc 2000A0E3 loc_000008: mov               r0,#0x20 +0000c 00000fc0 0A0000EB             bl                putchar (stub) +00010 00000fc4 FCFFFFEA             b                 loc_000008 ; ; g: ;  [ EXTERNAL ] ; +00000 00000fc8 80402DE9             stmdb             sp!,{r7,lr} +00004 00000fcc 00708DE2             add               r7,sp,#0x0 +00008 00000fd0 2000A0E3 loc_000008: mov               r0,#0x20 +0000c 00000fd4 050000EB             bl                putchar (stub) +00010 00000fd8 FCFFFFEA             b                 loc_000008 ; ; h: ;  [ EXTERNAL ] ; +00000 00000fdc 80402DE9             stmdb             sp!,{r7,lr} +00004 00000fe0 00708DE2             add               r7,sp,#0x0 +00008 00000fe4 2000A0E3 loc_000008: mov               r0,#0x20 +0000c 00000fe8 000000EB             bl                putchar (stub) +00010 00000fec FCFFFFEA             b                 loc_000008


I just compared the unoptimized assembler output of gcc:

# cat while.c int main() {    while(1) {};    return 0;}# cat forloop.c int main() {    for (;;) { };    return 0;}

Make assembler output:

# gcc -S while.c # gcc -S forloop.c 

Compare assembler files:

# diff forloop.s while.s1c1<   .file   "forloop.c"--->   .file   "while.c"

As you can see there are no significant differences. Here is the output

# cat while.s     .file   "while.c"    .text.globl main    .type   main, @functionmain:    pushl   %ebp    movl    %esp, %ebp.L2:    jmp .L2                    # this is the loop in both cases    .size   main, .-main    .ident  "GCC: (GNU) 4.4.3"    .section    .note.GNU-stack,"",@progbits

While this is not a technical proof that they are the same, I'd say it is in 99.9% of the cases.


There is hardly any difference in generated assembly. It's more of an stylistic issue:

Goto - just ooogly: jumps backward, no explicit infinite block

while(1) - better, requires "dummy" condition though and you'll be often warned by compiler(warning level 4) or static analysis tool

for(;;) might not be the prettiest, but imho fits best because this construct cannot have any other meaning (compared to while). But some other people prefer while(1) for the "same" reason...