在下面的代码中
label:
int a;
goto label;
它是创建新变量还是使用相同的变量
当我们使用goto一次又一次调用函数时
最佳答案
首先,这不会生成,因为标签后面必须跟一个语句,而声明不是一个语句:
6.8.1标记语句
语法
1 labeled-statement: identifier : statement case constant-expression : statement default : statement
Secondly, this shouldn't create a new variable. goto
does not introduce a new scope, and therefore doesn't create a new instance of a
each iteration. And even in situations where you are introducing a new scope, such as
for (;;) {int a; ... }
a
的空间(通常)只分配一次;即使在逻辑上为每个循环迭代处理一个新的a
实例,在物理上(通常)还是在回收相同的内存位置。任何在物理上为a
创建新空间而不回收先前空间的编译器都将严重损坏IMO。只是为了开心我写了如下:
#include <stdio.h>
#ifdef __STDC_VERSION__
#if __STDC_VERSION__ >= 199901L
#define C99
#endif
#endif
int main(void)
{
label:
#ifdef C99
;
#endif
int a;
printf("&a = %p\n", (void *) &a);
goto label;
return 0;
}
用
gcc -std=c99 -pedantic -Wall -Werror
构建它,得到以下输出:&a=0xbf98ad8c
&a=0xbf98ad8c
&a=0xbf98ad8c
&a=0xbf98ad8c
&a=0xbf98ad8c
&a=0xbf98ad8c
&a=0xbf98ad8c
&a=0xbf98ad8c
&a=0xbf98ad8c
&a=0xbf98ad8c
&a=0xbf98ad8c
&a=0xbf98ad8c
&a=0xbf98ad8c
&a=0xbf98ad8c