whuKK 2016-04-07 15:00 采纳率: 50%
浏览 2671
已采纳

C语言的陷阱:关于函数参数的“副作用”问题

当我们执行以下代码时:

 int x=1,y=0;   
printf("%d,x=%dy=%d",x=y,x,y) ;

会出现结果:
0,x=0y=0
也就是说在printf语句中由于x=y的影响,x的值被改变了。
但是如果我们写一个函数来完成类似的动作:
定义一个swap函数来交换xy变量的值:

 int  swap(int *a,int *b){
    int t;
    t=*a;
    *a=*b;
    *b=t;
    return 1;
}

之后我们用printf来输出,其中会用到swap函数,我们来看看swap函数的运行是否会影响接下来对xy的输出:

 int main(){
    int x=1,y=0;

    printf("return of swap is %d\tx=%d,y=%d\n",swap(&x,&y),x,y); 
    return 0;
}

上面这段代码的输出如下:
return of swap is 1 x=1,y=0
注意到了么?xy的值并没有交换。
难道swap函数没有执行么?为什么会有返回值呢?
我们再次输出xy的值试试:
在return语句之前增加语句:

 printf("\t\t\tx=%d,y=%d",x,y);

return of swap is 1 x=1,y=0
x=0,y=1
hey,xy的值又交换了!但是出现了延迟。
立即交换和有延时的交换之间的区别是为什么呢?

  • 写回答

5条回答 默认 最新

  • threenewbee 2016-04-07 15:12
    关注
     不是什么延迟,而是C语言是从后往前求函数参数的值,并且把值送入了堆栈。
    所以printf("return of swap is %d\tx=%d,y=%d\n",swap(&x,&y),x,y); 
    x y都先被放入了堆栈,然后才执行的swap,x y是复制到堆栈上的,所以再更改它们不会影响堆栈上它们的副本了。
    
    printf("x=%d,y=%d\treturn of swap is %d\n",x,y,swap(&x,&y)); 
    这样写,先执行swap,所以就是交换了。
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

悬赏问题

  • ¥20 pcf8563时钟芯片不启振
  • ¥20 pip2.40更新pip2.43时报错
  • ¥15 换yum源但仍然用不了httpd
  • ¥50 C# 使用DEVMOD设置打印机首选项
  • ¥15 麒麟V10 arm安装gdal
  • ¥20 OPENVPN连接问题
  • ¥15 flask实现搜索框访问数据库
  • ¥15 mrk3399刷完安卓11后投屏调试只能显示一个设备
  • ¥100 如何用js写一个游戏云存档
  • ¥15 ansys fluent计算闪退