c++ - 绕过定义时如何使用变量?

标签 c++ scope variable-declaration

在我看来,定义总是意味着存储分配。

在下面的代码中,int i在程序栈上分配一个4字节(通常)的存储空间并绑定(bind)到ii = 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/

相关文章:

c++ - 使用 Eigen 运行 CTest 时出错

c++ - 等价于 C++11 线程中的 WAIT_ABANDONED

c++ - 为什么 while 循环会跳过 char?

python - 获取要在 with 语句中执行的命令 block

javascript - ng-model 不与文本字段绑定(bind)

function - 在 `function` 语句中定义结果数据类型

c++ - 如果 T 对齐, std::vector<T> 也对齐吗?

javascript - 如何减少并改进丑陋的 JavaScript 代码?

php - 检查变量是否已在 PHP 中初始化

c++ - 如何在C++11中优雅地解决二义性声明?