iteye_1150 2009-02-12 18:07
浏览 263
已采纳

关于不用第三变量交换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。从而完成整个交换。

  • 写回答

4条回答

  • rednaxelafx 2009-02-13 00:09
    关注

    对于这段代码片段:
    [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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?