您的位置:首页 > 编程语言

一段很有意思的代码

2012-08-22 15:23 260 查看
一个简单的两个变量交换数值的算法,我们课本上有这个例题,我在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中得到的结果不一样。

这种算法非常精巧,有助于拓宽思路,但是不建议这样写程序,一方面太依赖计算顺序,也许你用这个语言可以用,换个语言就不能用了;另一方面可读性也不高,尽量避免这种算法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: