C语言运行结果······

来源:百度知道 编辑:UC知道 时间:2024/05/30 01:33:35
14.以下程序正确的运行结果是(29) ____ 。
int x1=30,x2=40;
main( )
{ int x3=10,x4=20;
sub(x3,x4);
sub(x2,x1);
printf("%d,%d,%d,%d\n",x3,x4,x1,x2);
}
sub(int x,int y)
{ x1=x;x=y;y=x1; }
答案是10,20,40,40
sub的用法是什么?答案怎么得来的?

这里你一定要理解是C语言函数调用时参数传递是按值传递的.用sub(x3,x4)来说明:x3,x4叫实参,也就是函数外面已经定义好的变量,x3=10,x4=20.而sub(int x,int y)中的x,y是形参,是当函数被调用时编译器在函数内部分配的局部变量,对函数外部而言是不可见的.sub调用一开始,编译器会把实参的值赋给形参,也就是x=x3和y=x4,赋值完成后的函数调用就和x3,x4没有任何关系了,x,y的任何操作都不会影响x3,x4的值.
然后再回答你上述两个问题:
1,sub的意图是想交换两个参数的值,x1是作为过渡变量.你可以想象成x,y是两个瓶子,要想交换两个瓶子里的水,就必须使用另外一个瓶子,暂时存放其中一个瓶子的水,x1就是这样一个瓶子.但是sub函数的写法是根本起不到交换的目的,原因就是上述解释的参数传递,x,y确定交换了,但与x3,x4没有关系,它们还是它们!
2,x1是全局变量,任何地方都是可见的,也就是可以修改的.所以sub(x3,x4);sub(x2,x1)唯一起的作用就是第一个参数将改变全局变量x1的值:第一次x3赋给x1变成10,第二次x2赋值x1变成40(这一次赋值才有真正效果),最终x1变成40,其它三个变量都没有改变!

其实我也不懂答案为什么会这样。不过我可以讲一下我的想法
在c语言里面,参数的传递是值传递
所以调用sub函数时,是把x1,x2,x3,x4的值传到函数中去。在函数中实现了两个值的交换。但是这对于原本的这两个数是没有影响的。因为他们的地址并不跟这个函数有关,

所以,我认为答案应该是10,20,30,40
哎,如果答案没错就是我功力不足了,我也是初学的。

sub是定义子用函数用的
{ x1=x;x=y;y=x1; }
不能用x1换个变量就可以了
sub(int x,int y)
{int m;m=x;x=y;y=m; }

x1在这个程序里只起到了交换值的做用了!
sub(x3,x4); 完后 x1=10 x2值没有变 x3=10 x4=20
sub(x2,x1); 完后 x1=40 x2=40