C语言一条简单的题目,

来源:百度知道 编辑:UC知道 时间:2024/06/24 23:48:31
#include<stdio.h>
void f(int v,int w)
{int t;
t=v;v=w;w=t;
}
main()
{int x=1,y=3,z=2;
if(x>y) f(x,y);
else if (y>z) f(y,z);
else f(x,z);
printf("%d,%d,%d\n",x,y,z);}
本人愚钝,心算出来的结果总是输出1,2,3
但是书本和VISUAL C++都说是1,3,2
不是因为“else if (y>z) f(y,z);”这一句将Y和Z的值调转了吗

你是没有分清传址和传值的区别。

void f(int v,int w)
{int t;
t=v;v=w;w=t;
}
对于这个函数,在main函数中进行 f(x,y)的调用后,只是将x,y的值分别赋给v,w,
然后在函数体中,将变量v,w的值进行了交换,这并不会影响x,y的值。
所以在进行了下列调用后:
if(x>y) f(x,y);
else if (y>z) f(y,z);
else f(x,z);
x,y,z的值不会有任何变化,仍然是1,3,2

再给你一个传址的情况,你比较一下:
#include<stdio.h>
void f(int *v,int *w)
{int t;
t=*v;*v=*w;*w=t;
}
main()
{int x=1,y=3,z=2;
if(x>y) f(&x,&y);
else if (y>z) f(&y,&z);
else f(&x,&z);
printf("%d,%d,%d\n",x,y,z);}
上面这个程序输出的是1,2,3,
因为是将x,y,z的地址传递给函数f,
所以v,w是指向这些地址的指针,对于*v,*w的操作将直接影响其所指向的地址中的值。所以x,y,z的值也就被改变了。


在你自己定义的函数里
void f(int v,int w)
{int t;
t=v;v=w;w=t;
}
调换了值

不是的,过程不是楼上说的那样,
过程是:
由于你的void f(int v,int w)没有返回值,所以在下面main()中调用时,x,y,z的值不会改变,最后printf("%d,%d,%d\n",x,y,z);}时,输出的值仍是一开始定义的值,所以仍是1,3,2

<