为什么x和y交换了这个a和b没有交换?

因为在jiaohuan2(a,b)的函数过程中

你的x,y就等效于a,b并且你也是return x,y;

执行一个被调用函数时,形参的值如果发生改变,并不会改变主调函数中的实参的值。

C语言要求函数的实参要有确定的值,在函数调用时给形参分配相应的内存单元,同时将实参的“值”赋(复制)给形参,实现数据从实参到形参的传递(‘值传递’方式)。因为是复制,所以在操作副本(形参)过程中不会影响到原本(实参)内容。

a=1,b=2,它们作为实参在函数调用过程中不会发生改变,x,y是形参,交换后的值发生变化,但是不会改变a,b的值

上面有一个回答说得很清楚了,关键原因是C语言只有按值传递,这意味着对形参的改变不影响实参,换言之只是临时的,这种临时改变对于调用者是不可见的。要么使用按引用传递(C语言没有这种东西),要么用指针。

但我们注意到你的代码还有一个非常大的误区:你的jiaohuan2中最后一句return x,y,看来你是希望返回两个值。在C语言中这是做不到的,试图用return返回多个值是完全错误的做法。你这样写实际的效果是先对逗号表达式x,y求值(结果等于y),再将y返回。x和y形参的改变对调用者jiaohuan则是不可见的。

void main()
{
int a=3;
int b=4;
printf("a=%d,b=%d",a,b);

a=a^b;
b=a^b;
a=a^b;

printf("a=%d,b=%d",a,b);

}