while(1){}是否与while(1)相同;

时间:2017-03-01 14:37:50

标签: c while-loop

我只想确定这个C代码:

while(flag==true)
{
} 
foo();

与此相同:

while(flag==true);

foo();

6 个答案:

答案 0 :(得分:9)

;是C中的 null语句

在您的情况下,{};在语法上是必需的,但它们也是如此:没有

相关:Use of null statement in C

答案 1 :(得分:3)

除了其他答案:这是一回事。

但我更喜欢这个:

while (condition)
{
} 
foo();

对此:

while (condition);
foo();

因为如果你在一段时间后忘记了分号,你的代码将编译正常,但它不会按预期执行:

while(condition)  // ; forgotten here
foo();           

实际上相当于:

while(condition)
{
  foo();
}

答案 2 :(得分:2)

是的,拥有一个空的循环体仅相当于while(<some condition>);

答案 3 :(得分:2)

是。遵循控制结构的;(例如,whilefor等)可以跟随一个块被视为后跟一个空块。

答案 4 :(得分:2)

,因为在while循环语句后面加分号表示空体,当条件变为false时,它会转到该循环后的紧接的下一个语句。

答案 5 :(得分:2)

,它们是一样的。

您可以生成代码的程序集,并亲眼看看它们生成相同的程序集。 (使用gcc filename.c -S -masm=intel -o ouputfilename

#include<stdio.h>

int foo(void);
int main(){

  int flag;
  scanf("%d" , &flag);
  while(flag==1);
  foo(); 
}


int foo(void){
  int x = 2;
  return x*x;
}
.LC0:
    .ascii "%d\0"
    .text
    .globl  main
    .def    main;   .scl    2;  .type   32; .endef
    .seh_proc   main
main:
    push    rbp
    .seh_pushreg    rbp
    mov rbp, rsp
    .seh_setframe   rbp, 0
    sub rsp, 48
    .seh_stackalloc 48
    .seh_endprologue
    call    __main
    lea rax, -4[rbp]
    mov rdx, rax
    lea rcx, .LC0[rip]
    call    scanf
    nop
.L2:
    mov eax, DWORD PTR -4[rbp]
    cmp eax, 1
    je  .L2
    call    foo
    mov eax, 0
    add rsp, 48
    pop rbp
    ret
    .seh_endproc
    .globl  foo
    .def    foo;    .scl    2;  .type   32; .endef
    .seh_proc   foo
foo:
    push    rbp
    .seh_pushreg    rbp
    mov rbp, rsp
    .seh_setframe   rbp, 0
    sub rsp, 16
    .seh_stackalloc 16
    .seh_endprologue
    mov DWORD PTR -4[rbp], 2
    mov eax, DWORD PTR -4[rbp]
    imul    eax, DWORD PTR -4[rbp]
    add rsp, 16
    pop rbp
    ret
    .seh_endproc
    .ident  "GCC: (x86_64-posix-seh-rev1, Built by MinGW-W64 project) 6.3.0"
    .def    scanf;  .scl    2;  .type   32; .endef

当我将while(flag == 1);更改为while(flag==1){}汇编代码生成时:

.LC0:
    .ascii "%d\0"
    .text
    .globl  main
    .def    main;   .scl    2;  .type   32; .endef
    .seh_proc   main
main:
    push    rbp
    .seh_pushreg    rbp
    mov rbp, rsp
    .seh_setframe   rbp, 0
    sub rsp, 48
    .seh_stackalloc 48
    .seh_endprologue
    call    __main
    lea rax, -4[rbp]
    mov rdx, rax
    lea rcx, .LC0[rip]
    call    scanf
    nop
.L2:
    mov eax, DWORD PTR -4[rbp]
    cmp eax, 1
    je  .L2
    call    foo
    mov eax, 0
    add rsp, 48
    pop rbp
    ret
    .seh_endproc
    .globl  foo
    .def    foo;    .scl    2;  .type   32; .endef
    .seh_proc   foo
foo:
    push    rbp
    .seh_pushreg    rbp
    mov rbp, rsp
    .seh_setframe   rbp, 0
    sub rsp, 16
    .seh_stackalloc 16
    .seh_endprologue
    mov DWORD PTR -4[rbp], 2
    mov eax, DWORD PTR -4[rbp]
    imul    eax, DWORD PTR -4[rbp]
    add rsp, 16
    pop rbp
    ret
    .seh_endproc
    .ident  "GCC: (x86_64-posix-seh-rev1, Built by MinGW-W64 project) 6.3.0"
    .def    scanf;  .scl    2;  .type   32; .endef

您可以看到两种情况下相关部分相同。

 //Below Portion is same in both cases. 
.L2:        
    mov eax, DWORD PTR -4[rbp]
    cmp eax, 1
    je  .L2
    call    foo
    mov eax, 0
    add rsp, 48
    pop rbp
    ret
    .seh_endproc
    .globl  foo
    .def    foo;    .scl    2;  .type   32; .endef
    .seh_proc   foo