天天看點

一道static類型筆試題

<pre name="code" class="cpp">#include<stdio.h>
int fun(int tmp)
{
	static int loop;
// 	printf("loop=%p\n",&loop);
// 	printf("loop=%d\n",loop);
	return(tmp+loop++);
}
static int loop =20;
static int count =5;

int _tmain(int argc, _TCHAR* argv[])
{
	int count = 10;
// 	printf("loop=%d\n",loop);
// 	printf("loop=%p\n",&loop);
	printf("global\t\tlocal static\n");
	for (;count>0;)
	{
		printf("%d\t\t%d\n",count,fun(--count));
	}
	return 0;
}
           

程式輸出結果

一道static類型筆試題
一道static類型筆試題

當時看完程式我給出的答案:local static 那一列全是29,而global那一列則是從10到1,想不到在vs2010上運作結果卻是如此。

接下來說說我的分析好了:首先是static關鍵字,這個可以參考http://blog.csdn.net/daliaojie/article/details/8112845

1、static修飾局部變量時,如果有指派,則會在程式開始時進行初始化工作,且隻操作一次,如果沒有指派,系統會自動賦初值0;

2、static變量和全局變量存儲在靜态存儲區,靜态局部變量可以儲存上一次運作此子產品的值;

3、程式中兩個地方出現的loop是不同的兩個變量,他們配置設定有兩個不同的記憶體位址;将注釋去掉如下圖:

一道static類型筆試題
一道static類型筆試題

4、printf()語句執行完後count的值已經自減一,是以輸出應從9開始,這是我做筆試題時習慣先把能夠一眼看出的直接寫出來,沒考慮到語句運作完後存儲該值記憶體位址上的值已經改變所緻

繼續閱讀