gpt4 book ai didi

c - goto构造是否创建新变量

转载 作者:太空宇宙 更新时间:2023-11-04 01:38:04 24 4
gpt4 key购买 nike

在下面的一段代码中

label:
int a;
goto label;

它是创建新变量还是使用相同的变量
还有当我们使用 goto 一次又一次地调用函数时会发生什么

最佳答案

首先,这不会构建,因为标签后面必须跟声明,而声明不是声明:

6.8.1 Labeled statements

Syntax

1    labeled-statement:        identifier : statement        case constant-expression : statement        default : statement

其次,这不应该创建一个新变量。 goto 不会引入新的范围,因此不会在每次迭代时创建 a 的新实例。甚至在您引入新作用域的情况下,例如

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

关于c - goto构造是否创建新变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10929835/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com