題目要求
有以下程序
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);
}