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倍。這些細節平時我都是不會注意的,突然出現這么一個問題,突然深知,我的編程之路的確還有很長。