C中变量的范围与寿命

时间:2011-10-03 07:25:10

标签: c++ c

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

4 个答案:

答案 0 :(得分:20)

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

“Lifetime”是程序执行期间存在的时间。

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

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

int main(){ foo(); foo(); foo(); }

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

相反:

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

int main(){ foo(); foo(); foo(); }

此处,由于x被声明为static,因此在程序执行开始之前,会为x保留空间。 x在内存中有一个固定的位置,它是一个静态变量。 C ++对这样一个变量的初始化有特殊的规则:它是在执行第一次通过声明时发生的。

因此,在foo的第一次调用中初始化此x,输出语句显示123,并且增量将值增加1.在下一次调用中,将跳过初始化(它具有已经执行过),输出值124,并再次递增该值。等等。

x的生命周期是从执行开始到执行结束。

答案 1 :(得分: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;
}

以上给出了输出:

  

4
  2
  4

在上述计划中,
变量x = 4的生命周期贯穿整个主要部分,即:它在整个执行主体时仍然存在,也可以在主要部分内访问,即它的范围。请注意,它在函数中不可访问,因为它超出了变量x的范围。

变量x = 2的范围和生命周期在主要内部的括号{ }内。

答案 2 :(得分:0)

变量的范围是在编译时确定的。它是程序中的一个区域,通过该标识符可以访问通过定义定义的同一对象。

对象的生命周期是在运行时通过执行流程定义的功能。即使定义它的变量不在范围内,也可以通过指针访问对象。

void f(char *a) {
  *a = 'f';
}

void g(void) {
   char aChar = ' ';
   f(&aChar);
}

此处变量aChar(标识符)的范围是g的主体。在执行g期间,对象的生命周期扩展为f的执行。在aChar中使用标识符 f将是非法的,编译器会告诉您类似“函数aChar中的未知的整数f”。如上所述,使用指向该对象的指针是完全合法的。

答案 3 :(得分:0)

变量的范围是指程序的不同部分可以访问变量的程度。 变量可以声明为:

  • 在一个称为局部变量或内部变量的函数内。

  • 在所有被称为全局变量或外部变量的函数之外,生命周期或“范围”在整个程序运行中都会延伸。

以下是有关带有示例的变量的详细教程:What is variable in C