【问题标题】:Local variables definition in relation to scope, C++与作用域相关的局部变量定义,C++
【发布时间】:2020-10-17 05:14:17
【问题描述】:

当考虑 main 内部的局部变量时,例如

#include <iostream>
void doNothing(int x)
{
}

int main()
{
  int x{0}, y{0};
  doNothing(x);
  
  return 0;
}

当输入函数 doNothing() 时,两个变量 (x,y) 是否仍会被考虑在范围内?我知道变量范围扩展到可以在源代码中访问标识符的位置,但据我了解,在函数 doNothing() 内部将无法访问 y

如果要理解一个局部变量的生命周期从它进入作用域开始,到它离开作用域结束,那么它的生命周期是否会结束并在运行时返回 main() 时恢复?

我认为这是不可能的,因为必须重新定义和重新实例化变量,这意味着返回到 main() 的顶部,但是如何仍然认为 y 仍然在范围内? doNothing(x) 的等待函数调用是否仍在作用域内?

(我知道这似乎是一个愚蠢的问题,因为它显然必须以某种方式在范围内,我只是想对我正在使用的所有东西有一个清晰的定义,也许是想太多了)

这个问题来自我目前正在阅读的编码教程中提供的注释,

请注意,局部变量的作用域和生命周期定义相同。对于局部变量,作用域和生命周期是相互关联的——也就是说,变量的生命周期从进入作用域开始,到离开作用域结束。

【问题讨论】:

  • 范围和生命周期是不同的概念。作用域处理符号名称,生命周期与对象有关。
  • 对,但是在我上面提供的引用的上下文中,局部变量共享相同的范围和生命周期定义,即使它们是不同的概念(编译时与运行时),我我仍然对它的生命周期是否已经结束感到困惑。也许我在教程中提供的注释的措辞有点混乱?
  • 我想我明白了,在运行时它的生命周期存在于它在编译时范围的边界内。由于它在 main 函数的范围内,它的生命周期将一直持续到它退出其范围的点(main 结束)。
  • 按标准。对象的生命周期从获得该对象的存储时开始 [6.6.3 P1],并在调用析构函数(或内存释放)时结束 [6.6.3 P2]。对于自动变量(您的 x/y) 这些变量根据 8.7 [6.6.5.3] 创建和销毁。每次执行声明语句时都会初始化具有自动存储持续时间的变量。在块中声明的具有自动存储持续时间的变量在退出块时被销毁 [8.7 P2]。
  • 即自动变量的生命周期在执行线程执行声明语句时开始,并在执行线程退出声明它的范围时结束,从而导致调用析构函数。注意:调用函数不会退出此上下文中的作用域,因为不会调用析构函数。好的。 int 没有构造函数/析构函数,但等效规则适用(对于 POD 类型的措辞更难解释)。

标签: c++ function scope function-call


【解决方案1】:

函数 doNothing()

时是否仍会在范围内考虑两个变量 (x,y)

您的问题中的问题是范围没有时间概念。它只有一个地方的概念。

符号在程序执行时不会进出范围。符号在程序内给定位置的范围内或范围外。

【讨论】:

    【解决方案2】:

    范围是指变量的“可见性”,因此变量xy的范围仅限于main()

    y 在函数 doNothing() 内部是不可访问的

    没错!

    如果要理解一个局部变量的生命周期从它进入作用域开始,到它离开作用域结束,那么它的生命周期是否会结束并在运行时返回 main() 时恢复?

    不完全是。听起来你在问变量在内存中存在多长时间,这通常是指生命周期。 xy 这样的局部变量在 main() 启动时被放入内存,但在 main() 结束时被释放。

    此页面可能是helpful,以了解范围和生命周期。 一些要点:

    • 定义变量时变量开始存在
    • 变量不再存在于定义变量的范围的末尾

    希望这有帮助:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-01
      • 1970-01-01
      • 2017-07-21
      • 1970-01-01
      • 1970-01-01
      • 2011-09-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多