大灾变cdda 劫后余生:c语言问题

来源:百度文库 编辑:高校问答 时间:2024/05/01 11:39:08
【2.36】下面程序的输出结果是____。
int w=3;
main()
{ int w=10;
printf("%d\n",fun(5)*w);
}
fun(int k)
{ if(k==0) return(w);
return(fun(k-1)*k);
}
A) 360 B) 3600 C) 1080 D) 1200
参考答案: B
要求有详细分析过程

首先程序是要求我们输出fun(5)*w,这里的w的值应该是主函数里定义的10还不是外面的全局变量3(变量的作用域),然后程序去调用子函数fun()来计算fun(5),根据题目,即返回fun(4)*5,... ,依次是fun(0)*1*2*3*4*5,而到fun(0)里应返回w,这里的w就应该是全局变量3了,因为这fun()中没有定义w这个变量。所以fun(5)最后的结果应该是3*1*2*3*4*5=360。
因此最终结果为fun(5)*10=3600

3*1*2*3*4*5*10
相当于:
main()
{ int w=10; ;//这里的w是局部变量。在main( )里是10
printf("%d\n",fun(5)*w);
}
fun(int k)
{ if(k==0) return(3);
return(fun(k-1)*k); //递归调用
}
int w=3; //这里是全局变量。w在main()外为3
如果是如下程序:
int w=3;
main()
{ int w=10;
printf("%d\n",fun(5)*w);
}
fun(int k)
{
return(fun(k-1)*k);
}

侧0×1×2×3×4×5×10

int w=3; //w是全局变量,作用域是所有函数;
main()
{ int w=10; //w是局部变量,只在这个函数中全局变量被屏蔽;
printf("%d\n",fun(5)*w);
}
fun(int k)
{ if(k==0) return(w); //全局变量中的w值;
return(fun(k-1)*k);
}

具体是3*1*2*3*4*5*10
w=3是全局变量,在没有同名字命名时用这个,但是在主函数里定义了w=10,这时全局变量被屏蔽了,但它的值还是在其他函数中起作用的(在其他函数不定义同名的变量时),fun()是一个递归函数,其作用就是调用函数本身,fun(5)把5赋给k,执行fun(5)=fun(4)*5,fun(4)=fun(3)*4,fun(3)=fun(2)*3,fun(2)=fun(1)*2,fun(1)=fun(0)*1,fun(0)=w=3,因为这时在fun()函数中没有定义w,所以用的是全局变量中的w值,之后算回去,fun(5)就为360,之后用到局部变量中的w=10,所以为3600

第二个return(fun(k-1)*k); 用的是函数递归调用,等到k=0时返回由于子函数用的W应为全局变量所以返回的是3,接着第二个返回的是5*4*3*2*1=120.然后结束递归返回120*3=360,而函数中的W为局部变量起作用的范围,故W=10,所以最后答案为3600.