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

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条)

报告相同问题?

悬赏问题

  • ¥30 帮我写一段可以读取LD2450数据并计算距离的Arduino代码
  • ¥15 C#调用python代码(python带有库)
  • ¥15 矩阵加法的规则是两个矩阵中对应位置的数的绝对值进行加和
  • ¥15 活动选择题。最多可以参加几个项目?
  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
  • ¥15 vs2019中数据导出问题
  • ¥20 云服务Linux系统TCP-MSS值修改?
  • ¥20 关于#单片机#的问题:项目:使用模拟iic与ov2640通讯环境:F407问题:读取的ID号总是0xff,自己调了调发现在读从机数据时,SDA线上并未有信号变化(语言-c语言)
  • ¥20 怎么在stm32门禁成品上增加查询记录功能
  • ¥15 Source insight编写代码后使用CCS5.2版本import之后,代码跳到注释行里面