关于不用第三变量交换2个变量的值???

public class Test {
public static void main(String[] args) {
int a = 1;
int b = 2;
a = b + (b = a) * 0; //这句实现交换
System.out.println("a:" + a + " b:" + b);
}
}

最近朋友给一道题,不用第三变量交换2个变量的值,手法很高明,但不知道原理.
大家一起分析下,怎么完成的,内存分析更好...

[b]问题补充:[/b]
[b]先感谢lewhwa的回答,不理解的第四步此时b的值应给为1,也就是1+0=1;为什么还是2呢?[/b]

这个巧妙运用了语言的运算符优先级(右侧优先,括号优先)。
首先,从右边开始。然后是这样的步骤:
1.b=2 已经保存了2;准备计算后边。
2.()>*,将a->b,此时=1;
3.1*0=0;
4.再将2+0=2赋值给a。从而完成整个交换。

对于这段代码片段:
[code]int a = 1;
int b = 2;
a = b + (b = a) * 0;[/code]
如果将其转换为静态单赋值形式,并限制每个语句都是一个二元运算与一个赋值,就变成:
[code]int a0 = 1;
int b0 = 2;
int b1 = a; // (b = a)
int temp1 = b1 * 0; // (b = a) * 0
int a1 = b0 + temp1; // b + (b = a) * 0[/code]
这样就比较明显了:a0、b0是交换前的值,a1、b1是交换后的值。
说真的这样写只是在自己的代码里少用了个临时变量而已。编译器还是得插入一些临时变量,并不是说自己少用了显式的变量就等于实际运行效率高。

以前也碰到过类似的“优化”的误解,记了一篇,这里http://rednaxelafx.iteye.com/blog/134002

位运算,a=a^b;b=a^b;a=a^b;05年人家问过我同样的问题,具体你化成2进制算一下就知道了。

[quote]a = b + (b = a) * 0; //这句实现交换[/quote]
这个巧妙运用了语言的运算符优先级(右侧优先,括号优先)。
首先,从右边开始。然后是这样的步骤:
1.b=2 已经保存了2;准备计算后边。
2.()>*,将a->b,此时=1;
3.1*0=0;
4.再将2+0=2赋值给a。从而完成整个交换。

[quote]1.b=2 已经保存了2;准备计算后边[/quote]
这个先做,早就在呆在内存里咯!