今天我刚来这论坛,第一个就是看的是你的贴子,所以,很认真地看完,我是这样认为的:
要知道主调函数和被调函数的区别。
主调函数的变量在内存中开辟后就一直到程序结束才被释放,而被调函数的变量只有使用到时才会临时开辟,调用完毕马上释放。
所以有以下分析:
int i=0;
fun1 (int i)
{ i = (i%i)*(i*i)/(2*i)+4 ;
printf(“i=%d\n”,i);
return (i) ;
}
fun2(int i)
{ i = i<=2 ? 5 : 0 ;
return (i) ;
}
main ( )
{ int i = 5 ;/*这里的i是局部变量,在main中有效*/
fun2(i/2) ; printf(“i=%d\n”,i) ; /*这里的i/2就等于2,传到fun2()后返回5对吧,但这个返回值对其后的printf丝毫没影响,因为fun2()中的i在被调用后内存就没了,所以printf输出的还是原来main()中的i*/
fun2(i=i/2) ; printf(“i=%d\n”,i) ;/*注意!i=i/2已经是出现在main中的一个赋值语句,所以原来在main中的i值就变为2,也即在内存中已经改变,后面的main中的i值就变啦!
好 i=i/2就等于2就传到fun2返回5,可是这个5对后面的printf没用,printf中用的是main的i,所以就是2啦!*/
fun2(i/2) ; printf(“i=%d\n”,i) ;/*知道i/2等于多少了吗?是1!,传到fun2返回0,但是printf用的依然是main中的i,所以输出2*/
fun1(i/2) ; printf(“i=%d\n”,i) ;/*i/2等于1传到fun1后,i%i(即1%1)就等于0,使用fun1输出fun1中的i值4,然后返回4,在main中用printf输出main中的i,也就是上一句的说的i值2啦!*/
呵呵,如果觉得我没说错的话就顶一下吧!
}