編程小白C語言題目練習2

題目要求

有以下程序
int a=2;
int f(int n)
{ static int a=3; 
int t=0;
if(n%2){ static int a=4; t += a++; }
else { static int a=5; t += a++; }
return t+a++;
}
main()
{ int s=a, i;
for( i=0; i<3; i++) s+=f(i);
printf("%d\n", s);
}
程序運行後的輸出結果是(    )。

思路分析 

解本題耍弄清楚這樣幾點:
1、定義“int a=2;”中的全局變量a,其作用範圍是從定義此變量的位置開始到本源文件結束;
2、“static int a=3;”中的靜態局部變量a的作用範圍是其所在的函數f,並對其只賦一次初值,以後每次調用函數時不再重新賦初值,而只是保留上次函數調用結束時的值;
3、複合語句“{static int a=4;t+=a++; }”和“{static int a=5;t+=a++;}”中定義的兩個變量a屬於複合語句中定義的變量,作用範圍只在其本身所在的複合語句內。對於本程序來講,第三行定義的靜態局部變量並不會對四、五兩行的複合語句產生作用,這是因爲複合語句中也定義了與其同名的靜態局部變量。

所以
當f(0)時,執行else語句,t=5,返回值爲t+a++即5+3(++)=8  此後a++了,下一輪執行這個else語句時,a的值爲6
當f(1)時,執行if語句,t=4,返回值爲t+a++,即4+4(++)=8
當f(2)時.執行else語句,在else語句中a++了,所以t=6,返回值爲6+5(++)=11
注意s初始化的值並不爲0,而且s=a(全局變量的a)=2,所以最後s=2+8+8+11=29

完整代碼 

#include<stdio.h>
int a=2;
int f(int n)
{ 
	static int a=3; 
	int t=0;
	if(n%2)
	{ 
		static int a=4; t += a++; 
	}
	else 
	{ 
		static int a=5; 
		t += a++; 
	}
	printf("t=%d\n",t); //增加這行代碼方便觀察t的值
	return t+a++;
}
int main()
{ 
	int s=a, i;
	for( i=0; i<3; i++) 
	s+=f(i);
	printf("s=%d\n", s);
}

查看結果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章