static “一個被聲明為靜態的變量在這一函數被調用過程中維持不變”什么意思?


static 一個被聲明為靜態的變量在這一函數被調用過程中維持不變

這句話什么意思? static聲明的變量很顯然是可以被改變的啊?


void fun1()
{
static int var = 40;
printf("var1 = %d\n",var);

var   =60;

printf("var2 = %d\n",var);
}



難道答案不是  var1 = 40
             var2 = 60

誰給解釋下這句話的意思。。


19 个解决方案

#1


是在調用的過程中不會改變啊!也就是其他函數調用他是不會改變他的值

#2


static局部變量,聲明只被執行一次

拿LZ你的例子來說,第一次調用fun1()輸出為:
var1 = 40
var2 = 60
而第二次調用的時候,static int var = 40將不被運行,var的值繼承上次運行后的var值(即60),故輸出結果為
var1 = 60
var2 = 60
當然,之后調用fun1()自然也是如上的輸出結果了

#3


單步調試和設斷點調試是程序員必須掌握的技能之一。

#4


引用 2 樓 pamtry 的回復:
static局部變量,聲明只被執行一次

拿LZ你的例子來說,第一次調用fun1()輸出為:
var1 = 40
var2 = 60
而第二次調用的時候,static int var = 40將不被運行,var的值繼承上次運行后的var值(即60),故輸出結果為
var1 = 60
var2 = 60
當然,之后調用fun1()自然也是如上的輸出結果了

對頭!!!

#5


其實可以這樣理解,static局部變量的生存周期是不會隨着函數的結束而結束的,這點上有點類似全局變量。
拿lz的例子來說,運行效果等效於:


int var = 40;
void fun1()
{
    printf("var1 = %d\n",var);

    var   =60;

    printf("var2 = %d\n",var);
}


但是和全局變量所不同的地方是,其可見范圍和普通局部變量的生存周期相同

#6



#include <cstdio>
using namespace std;
void fun1()
{
    static int var = 40;
    printf("var1 = %d\n",var);

    var   =60;

    printf("var2 = %d\n",var);
}
void fun2()
{
int var = 40;
    printf("var1 = %d\n",var);

    var   =60;

    printf("var2 = %d\n",var);
}

void main()
{
fun1();
fun1();
fun2();
fun2();
}

#7


簡單的說 C語言的靜態變量 生命周期和進程一樣長 進程不死這個變量不會消失 老不死的所以叫靜態 

你把靜態變量放在函數里面改變了他的可見范圍 

你給他復制它當然變了

給點分吧 打了這么多字

#8


引用 7 樓 emailtome 的回復:
簡單的說 C語言的靜態變量 生命周期和進程一樣長 進程不死這個變量不會消失 老不死的所以叫靜態 

你把靜態變量放在函數里面改變了他的可見范圍 

你給他復制它當然變了

給點分吧 打了這么多字


你的頭像太惡心了。。。

#9


建議看看:
static關鍵字

#10


引用 2 樓 pamtry 的回復:
static局部變量,聲明只被執行一次

拿LZ你的例子來說,第一次調用fun1()輸出為:
var1 = 40
var2 = 60
而第二次調用的時候,static int var = 40將不被運行,var的值繼承上次運行后的var值(即60),故輸出結果為
var1 = 60
var2 = 60
當然,之后調用fun1()自然也是如上的輸出結果了


明白了。。可是這句話說的怎么就這么不好明白呢。。

#11


引用 9 樓 pathuang68 的回復:
建議看看:
static關鍵字


好的!

#12


這里想表達的意思是“下次調用,這東西還在(維持不變)”。

#13


在執行一遍這個函數你就知道是什么意思了。

#14


static變量據說是很早就分配好空間了,在整個程序運行期間,它的空間都是存在的,但是它的作用域卻不一定是全局,就算它所在的函數不被調用了,它的空間也是存在的,下次再調用時,它的值也還是存在的。不過static也限制了變量的作用域
我是這樣理解的

#15


引用 2 樓 pamtry 的回復:
static局部變量,聲明只被執行一次

拿LZ你的例子來說,第一次調用fun1()輸出為:
var1 = 40
var2 = 60
而第二次調用的時候,static int var = 40將不被運行,var的值繼承上次運行后的var值(即60),故輸出結果為
var1 = 60
var2 = 60
當然,之后調用fun1()自然也是如上的輸出結果了

正解

靜態局部變量只初始化一次,第一次調用函數時初始化。

#16


簡單點說就是 static變量只被初始化一次,第二次調用fun1()函數時,不會初始化static變量

#17


引用 4 樓 p95635746 的回復:
引用 2 樓 pamtry 的回復:
static局部變量,聲明只被執行一次

拿LZ你的例子來說,第一次調用fun1()輸出為:
var1 = 40
var2 = 60
而第二次調用的時候,static int var = 40將不被運行,var的值繼承上次運行后的var值(即60),故輸出結果為
var1 = 60
var2 = 60
當然,之后調用fun1()自然也是如上的……

贊同

#18


引用 17 樓 kelvin460022272 的回復:
引用 4 樓 p95635746 的回復:
引用 2 樓 pamtry 的回復:
static局部變量,聲明只被執行一次

拿LZ你的例子來說,第一次調用fun1()輸出為:
var1 = 40
var2 = 60
而第二次調用的時候,static int var = 40將不被運行,var的值繼承上次運行后的var值(即60),故輸出結果為
var1 = 60
var2 = 6……

在static聲明之后,創建之后就會存在靜態內存里,而不是在棧堆里,第一次函數調用完成后不會銷毀,第二次調用的時候就不會重新創建。但是它的作用域還是在函數里面。

#19


引用 18 樓 kelvin460022272 的回復:
引用 17 樓 kelvin460022272 的回復:
引用 4 樓 p95635746 的回復:
引用 2 樓 pamtry 的回復:
static局部變量,聲明只被執行一次

拿LZ你的例子來說,第一次調用fun1()輸出為:
var1 = 40
var2 = 60
而第二次調用的時候,static int var = 40將不被運行,var的值繼承上次運行后的var值(即……


正解,假如你將static int var = 40改為int var = 40,調用該函數后,就會銷毀,而再次調用時,就會再創建一個新的。而聲明為靜態變量后,直到進程結束時,才會銷毀。

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com