在下面的代码中

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

10-05 21:15