在我看来,定义总是意味着存储分配。
在下面的代码中,int i
在程序栈上分配一个4字节(通常)的存储空间并绑定(bind)到i
,i = 3
将 3 分配给该存储。但是由于goto
,定义被绕过,这意味着没有为i
分配存储。
我听说局部变量要么在它们所在的函数入口(本例中为 f()
)分配,要么在定义点分配。
但无论哪种方式,如何在 i
尚未定义的情况下使用它(根本没有存储空间)?执行 i = 3
时,值 3 赋值在哪里?
void f()
{
goto label;
int i;
label:
i = 3;
cout << i << endl; //prints 3 successfully
}
最佳答案
长话短说; goto
将导致运行时跳转,变量定义/声明将导致存储分配,编译时间。
编译器将查看并决定为 int
分配多少存储空间,它还将使分配的存储空间在“命中”时设置为 3
"i = 3;
.
即使在你的函数的开头有一个 goto
,那个内存位置也会在那里,在声明/定义之前,就像在你的例子中一样。
非常愚蠢的比喻
如果我把一根木头放在地上,我的 friend 跑(闭着眼睛)跳过它,木头仍然会在那里——即使他没有看到或感觉到它。
如果他愿意,可以说他可以转身(稍后)将其点燃,这是现实的。他的跳跃并没有让原木神奇地消失。
关于c++ - 绕过定义时如何使用变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8535731/