一段很有意思的代码

一个简单的两个变量交换数值的算法,我们课本上有这个例题,我在CSDN的论坛上看到了这个算法,拿出来分析一下:

public class Shenjisuanfa {
    public static void main(String[] args) {
        int num1 = 7777, num2 = 3333, temp;
        System.out.println("交换前 num1=" + num1 + ",num2=" + num2);
        /*
         temp=num1;
         num1=num2;
         num2=temp;
         */
        num1 = num2 + 0 * (num2 = num1);//注意,此算法极度依赖编译器对运算顺序的定义
        System.out.println("交换后 num1=" + num1 + ",num2=" + num2);
    }
}


注释部分是课本上的传统方法,这个方法是一定正确的。关键在于这一行:num1 = num2 + 0 * (num2 = num1);

在java中这一行可以实现num1和num2两个变量的值的互换,我估计计算顺序可能是这样的:因为存在赋值运算,所以首先计算赋值运算符右边的部分,num1+0 * (num2 = num1),先提取出num1的值放入存储区,再来计算0 * (num2 = num1),0放入存储区,然后是num2 = num1,这时num1的值被赋予num2,然后num2被放入存储区,乘以0结果当然是0,此时只需要计算num1=num2这一步了,于是num2的原始值被赋给num1了,刚才num2被赋值成num1的原始值,这就实现了两个变量互换值。当然也可能是其它的具体实现,但是基本顺序应该差不多。

这个算法非常依赖计算顺序,如果先计算的是(num2 = num1),结果就完全不一样,至少我用C语言写了这个程序,在Gcc编译器上是和java中得到的结果不一样。

这种算法非常精巧,有助于拓宽思路,但是不建议这样写程序,一方面太依赖计算顺序,也许你用这个语言可以用,换个语言就不能用了;另一方面可读性也不高,尽量避免这种算法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值