zoukankan      html  css  js  c++  java
  • 关于局部变量在循环里的生存法则

    1.局部变量的生命周期是在一个大括号内,即一个所处块结束。如循环体内定义的int j;

    学过C++的同学都知道局部变量和全局变量的区别,局部变量的生命周期是从创建开始到所处的块结束就被回收,而全局变量的生命周期是从创建开始到程序结束。而在最近我在学习java的时候让我对局部变量在循环里的生命周期有了更深的了解。

    正如上面所说,局部变量是直到所处的块结束才从调用栈中把它回收。先看下面的代码。

    for(int i = 0;i<10;i++)
    {
    //....
    }

    上面代码中的的整型变量i知道for循环结束之后才被调用栈回收。它经历了10次for的运算,知道i=10的时候才退出循环,i被调用栈销毁。

    下面我们看另一个代码

    	for (int i = 0; i != 10; i++)
    	{
    		int j;
    		j = i;
    		cout << j << endl;
    		cout << &j << endl;
    	}
    	return 0;

    可以发现j在每次循环的时候都被定义了,j也是一个局部变量,开始我认为应该到for循环结束才被收回,但是不对。如果在当时没有被收回,就会出现了10个j出现在调用栈里面,不会编译错误吗?即使编译过了,但还是很占内存吧。因此我按照上面的代码一步一步的调试。发现当一次for之后 ,j的值 和j的地址都不存在。同样我用java也试了几次。也发现同样的。

    因此我认为 for上定义的int i所处的块是整个for循环,而int j所处的块为一个for循环。那么int i的生命周期比int j的生命周期多10倍。这些细节平时我都是不会注意的,突然出现这么一个问题,突然深知,我的编程之路的确还有很长。

  • 相关阅读:
    修复 Visual Studio Error “No exports were found that match the constraint”
    RabbitMQ Config
    Entity Framework Extended Library
    Navisworks API 简单二次开发 (自定义工具条)
    NavisWorks Api 简单使用与Gantt
    SQL SERVER 竖表变成横表
    SQL SERVER 多数据导入
    Devexpress GridControl.Export
    mongo DB for C#
    Devexress XPO xpPageSelector 使用
  • 原文地址:https://www.cnblogs.com/panxuejun/p/5896921.html
Copyright © 2011-2022 走看看