vlambda博客
学习文章列表

一道90%的人都会出错的C语言经典例题,不来测试下?



作者

闫小林

白天搬砖,晚上做梦。我有故事,你有酒么?


题目要求:交换x、y的值,话不多说直接上代码:


#include<stdio.h>

void swap(int x,int y); 

int main()

{

    int x=3;

    int y=4;

    swap(x,y);

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

    return 0;

}

void swap(int x,int y){

    int t;

    t=x;

    x=y;

    y=t;

}


请读者仔细阅读一下代码,看看能不能发现逻辑错误。


代码语法是没有一点问题的,编译后如图所示:


一道90%的人都会出错的C语言经典例题,不来测试下?


但是运行后就出问题,运行结果如图所示:


一道90%的人都会出错的C语言经典例题,不来测试下?


为什么输出x、y的值没有交换位置呢?


接下来小林仔细分析下这道题:


从第一行到第六行读者应该都可以看懂,就是从第七行开始,swap函数开始,出现了逻辑错误。


第7行swap里面的x、y是实参,调用swap这个函数,要把实参的值传递给第11行swap函数里面的形参。


值传递之后,在swap函数里面x、y实现了位置交换。


但是注意,形参值的变化不会对实参有影响,因为值传递是单向的,只能由实参到形参。


因此第八行输出的x、y还是main函数里面定义的x、y。


那么有办法解决这个问题么?


一道90%的人都会出错的C语言经典例题,不来测试下?


以上是一个治标不治本的方法。


治本的方法就看这篇文章反响了,看的人多的话后期出一个治本的方法,提一下指针可以解决这个问题一道90%的人都会出错的C语言经典例题,不来测试下?


往期文章:点击链接直接get


一道90%的人都会出错的C语言经典例题,不来测试下?
长按订阅

printf("我看看有多少人想看治本的方法!”)