package ch2_expressive_puzzlers.puzzle_7;
public class CleverSwap {
public static void main(String[] args) {
int x = 1984;
int y = 2001;
x ^= y ^= x ^= y;
System.out.println("x = " + x + "; y = " + y);
}
}
//out
// x = 0; y = 1984
正如类名,理应该是实现两个数的交换,但是不行,因为在Java语言中,操作符的操作数是从左到右求值的,而在c++、c语言中是可行的,因为c++操作符的操作数是从右到左求值的。在Java中,它实际的执行顺序如下
int x = 1984;
int y = 2001;
int tmp1=x;
int tmp2=y;
int tmp3=x^y;
x=tmp3;
y=tmp2^tmp3;
x=tmp1^y;
ps:
以下是C或者c++数值交换的几种方式
1.c风格:采用指针方式
viod swapptr(int *a,int *b)
{
int tmp=*a;
*a=*b;
*b=tmp;
}
2.c++风格:采用references
void swaoRef(int &a,int &b)
{
int tmp=a;
a=b;
b=tmp;
}
3.
#include<stdio.h>
int main()
{
int a,b,tmp;
scanf("%d%d",&a,&b);
printf("before exchange\n a=%d,b=%d\n",a,b);
tmp=a;
a=b;
b=tmp;
printf("after exchange\n a=%d,b=%d\n",a,b);
return 0;
}
4.
#include<stdio.h>
int main()
{
int a,b;
scanf("%d%d",&a,&b);
printf("before exchange\n a=%d,b=%d\n",a,b);
a=a+b;
b=a-b;
a=a-b;
printf("after exchange\n a=%d,b=%d\n",a,b);
return 0;
}
5.
#include<stdio.h>
int main()
{
int a,b;
scanf("%d%d",&a,&b);
printf("before exchange\n a=%d,b=%d\n",a,b);
a=a^b;
b=a^b;
a=a^b; //A=A^B^B, B=A^B^A
printf("after exchange\n a=%d,b=%d\n",a,b);
return 0;
}
6.不可用,实质上没有交换。因为在调用的时候,实参m和n的值送给形参a和b,虽然函数里面交换了a和b的值,但是不会影响实参的m和n的改变,调用时局部变量a和b被撤销,实参的值不变。
viod swap_error1(int a,int b)
{
int tmp=a;
a=b;
b=tmp;
}
7.不可用,实质上没有交换。下面的代码只交换实参指针的指向
viod swap_error2(int *a,int *b)
{
int *tmp;
tmp=a;
a=b;
b=tmp;
}