我有这个程序:
int main(){
while(1) printf("Hi\n");
}
这真的重复了吗?如果我将while(1)
放在没有printf
的情况下,重复次数是否相同?如果不是永远,当堆栈溢出?该计划:
int main(){
loop:;
printf("Hi\n");
goto loop;
}
与第一个相同?如果没有什么区别?
答案 0 :(得分:6)
您的两个程序是等效的。一个例子:
#include <stdio.h>
void f1(void)
{
while(1)
printf("Hi\n");
}
void f2(void)
{
loop:
printf("Hi\n");
goto loop;
}
编译:
cc -O3 -c -o example.o example.c
查看输出二进制文件:
example.o:
(__TEXT,__text) section
_f1:
0000000000000000 pushq %rbp
0000000000000001 movq %rsp, %rbp
0000000000000004 pushq %rbx
0000000000000005 pushq %rax
0000000000000006 leaq L_str1(%rip), %rbx ## literal pool for: "Hi"
000000000000000d nopl _f1(%rax)
0000000000000010 movq %rbx, %rdi
0000000000000013 callq _puts
0000000000000018 jmp 0x10
000000000000001a nopw _f1(%rax,%rax)
_f2:
0000000000000020 pushq %rbp
0000000000000021 movq %rsp, %rbp
0000000000000024 pushq %rbx
0000000000000025 pushq %rax
0000000000000026 leaq L_str1(%rip), %rbx ## literal pool for: "Hi"
000000000000002d nopl _f1(%rax)
0000000000000030 movq %rbx, %rdi
0000000000000033 callq _puts
0000000000000038 jmp 0x30
请注意,它们包含相同的说明。
答案 1 :(得分:4)
是的,while(1)
将永远循环,或者至少在您终止进程或机器崩溃之前。它相当于第二个程序。它没有递归,因此不存在堆栈溢出的可能性。