【发布时间】: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