C中变量的范围与寿命

vik*_*kky 7 c c++

有人可以在C语言中准确地解释变量的范围和生命的概念吗?它在C++中是否有所不同?我对范围和生活感到困惑.

Che*_*Alf 21

变量的"范围"是源代码的一个区域,您可以在其中引用该变量.

"生命周期"是程序执行期间存在的时间.

默认情况下,局部变量的生命周期与其范围相同:

void foo()
{
    int x = 123;
    cout << x << endl;
    x += 1;
}

int main(){ foo(); foo(); foo(); }
Run Code Online (Sandbox Code Playgroud)

在这里,每次foo调用x都会创建一个new (在堆栈上为它保留空间),并且当执行离开x声明的块时,会x被销毁(这int仅仅意味着保留的空间现在被释放了重复使用).

相反:

void foo()
{
    static int x = 123;
    cout << x << endl;
    x += 1;
}

int main(){ foo(); foo(); foo(); }
Run Code Online (Sandbox Code Playgroud)

这里,因为x声明了static,所以x在程序执行开始之前保留空间.x在内存中有一个固定的位置,它是一个静态变量.C++有关于这种变量初始化的特殊规则:它是在执行第一次通过声明时发生的.

因此,在第一次调用foo这个x被初始化时,输出语句显示123,以及增量增加1的值在接下来的呼叫的初始化被跳过(它已被执行),该值是124输出,并且值再次递增.等等.

这种生命周期x从执行开始到执行结束.


Alo*_*ave 5

范围是可以访问变量的区域.
生命周期是对象保持有效的时间跨度.

一个简单的例子:

#include <iostream.h>

void doSomething()
{
    x = 5; //Error! Not Accessible
}

int main() 
{

      int x = 4;
      std::cout<< x << endl;
      {
            int x = 2;
            cout << x << endl;
      }
      doSomething(); 
      std::cout<< x << endl;
      return 0;
}
Run Code Online (Sandbox Code Playgroud)

以上给出了输出:

4
2
4

在上面的程序
中,变量的生命周期x = 4贯穿整个主程序,即:它在main的执行过程中保持活动状态,也可以在main中访问,即它的范围.请注意,它在函数中不可访问,因为它超出了变量的范围x.

变量的范围和生命周期x = 2在main { }内部的括号中.