之前有个同学发了一个关于“颠覆你思维的帖子”;主要说的有1.java的浮点运算的不精确。2交换a,b的值!
关于交换a,b的值一直没有想明白为什么?上代码- int a=2;
- int b=1;
- <blockquote>a=b+0*(b=a);
复制代码 首先你看到后,想一下ab到底是多少?a=b+0*(b=a);你会想应该先是b=a;之后呢,a=b?然后是不是应该a=b=1?
如果你是这么想的好吧,这个帖子会为你解答为什么是a,b交换。
1.首先我们想一下a=b+0*(b=a);表达式是怎么样在内存中执行的。由于第一个=后面先执行,所以会有b压栈,也就是说b先压栈了!1是在栈中!然后进行了b=a。由于后面值为0;所以表达式出栈的时候会有a=1;会交换了;
2.你不相信,好样的!你可以换一下a=0*(b=a)+b;这样先进行的是b=a;于是你会发现a=b=2!
3.到了这儿,我想会有人说,在栈中是1,为什么不是变量b?我想在jvm设计的时候的问题吧。我试了一下在c/c++下。- #include<stdio.h>
- void main()
- {
- int a=2;
- int b=1;
- a=0*(b=a)+b;
- printf("%d----%d",a,b);
- }
复制代码 无论怎么样都不会出现交换!我想这是编译器的设计逻辑不同吧!
1.在java中表达式在栈中是一个实值。2.在c/c++中还是变量!
4.那么再次举一个例子- int a=2;
- int b=1;
- a=b+(b=3);
复制代码 这样a=4;你不会在认为栈中是变量了吧!
总结:在我们进行分析时要多去考虑jvm的处理细节才会、更好的理解代码。另外一点,这个关于交换代码,要根据你的代码环境而言。不是什么语言都通用的!
本文均为个人观点,如有意见或错误,及时给我纠正!谢谢。
|