c问题 那位高手讲解一下

来源:百度知道 编辑:UC知道 时间:2024/09/24 15:16:56
#include <stdio.h>
int i=0;
workover (int i)
{
i=(i%i)*((i*i)/(2*i)+4);
printf("i=%d\n",i);
return (i);
}
reset (int i)
{
i=i<=2?6:0;
return (i);
}
void main()
{
int i=5;
reset(i/2); printf("i=%d\n",i);
reset(i=i/2); printf("i=%d\n",i);
reset(i/2); printf("i=%d\n",i);
workover(i); printf("i=%d\n",i);
}
这个程序结果i=5
i=2
i=2
i=0
i=2为什么呢
帮忙解答一下

这里的函数都是值传递,因而对传入的参数不作任何改变.
1.
reset(i/2); printf("i=%d\n",i);值传递,i不变,仍是5
2.
reset(i=i/2); printf("i=%d\n",i);i=I/2=2;值传递,i不变.为2.
3.
reset(i/2); printf("i=%d\n",i); 值传递,i不变.为2

4.
workover(i); printf("i=%d\n",i);
函数内有一个printf("i=%d\n",i);
i=(i%i)*((i*i)/(2*i)+4); 此语句无论传入何值,都为0,因为i%i==0;所以输出0.
返回后printf("i=%d\n",i); 值传递,i不变.为2

另虽然此程序定义了一个全域变量,int i=0;
但在main()内也定义了一个同名的int i=5内部变量,因变量作用域的原因,在main()内调用的都是内部变量int i=5,所以4次函数都没有对全域变量int i=0;调用.