【问题标题】:C++ for loop variable lifetime is weirdC++ for 循环变量的生命周期很奇怪
【发布时间】:2015-05-10 04:31:35
【问题描述】:
for(int i = 0; i < 3; i++)
{
    for(int j = 0; j < 3; j++)
    {
        int n;
        n++;
        printf("n : %d\n", n)'
    }
}

代码的输出是1 2 3 4 5 6 7 8 9。我想知道为什么for循环中的变量n在执行变量声明时没有初始化。

【问题讨论】:

  • 我不知道 C++ 究竟是如何工作的,但是,根据我使用 C 的经验,也许它分配在同一个内存块中?尝试 int n = 0。

标签: c++ variables scope initialization lifetime


【解决方案1】:

您永远不会将 n 初始化为特定值。当您调用int n 时,C++ 默认不会执行此操作。相反,它只保留一个整数大小的内存块。因此,当您调用n++ 时,程序只是抓取该内存中发生的任何值并递增它。由于您快速连续地执行此操作,并且没有在其间创建新变量,因此它恰好一遍又一遍地获取相同的内存。正如@NicolasBuquet 所指出的那样,编译器优化也可能负责选择同一块内存的一致性。

如果您要为 n 分配一个值(即int n = 1;),则此行为将消失,因为特定值将写入分配给 n 的内存块。

【讨论】:

  • 我认为这也是由于优化器:当您在循环的每次迭代中声明相同的 int 变量时,我认为编译器对其进行了优化并将变量放在循环之外而不是创建它在每一步。
  • 没有优化也一样有意义,因为在每次迭代期间没有在堆栈上声明任何其他内容,因此变量每次都在堆栈上获得相同的位置。
【解决方案2】:

在 C++ 中,没有使用默认值初始化变量;如果您发现需要这样做,您必须明确指定一个。

您的代码的结果确实是未定义的;您按顺序获得数字 1 到 9 纯属运气。在其他机器或 C++ 实现上,您可能会得到不同的结果。

【讨论】:

  • 许多变量用默认值初始化。作为内置类型的自动变量不会自动初始化。写得不好的类的成员可能不会自动初始化。但是,您是正确的,示例代码中的n 未初始化。
  • 具有静态存储持续时间的变量是值初始化的(即基本类型为零初始化)
  • 大声笑,好吧,伙计们,你让我到了那里。我在这两点上都得到了纠正。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-09
  • 1970-01-01
  • 2012-05-19
相关资源
最近更新 更多