当前位置: 代码迷 >> Web前端 >> java基础之口试篇二-自加i++(小东西蕴藏大哲理)
  详细解决方案

java基础之口试篇二-自加i++(小东西蕴藏大哲理)

热度:118   发布时间:2012-09-20 09:36:50.0
java基础之面试篇二------自加i++(小东西蕴藏大哲理)

?????世界上往往最复杂的东西,看起来都最简单,比如i++和++i,前面这个是先用再加,后面是先加再用,道理人人都懂,但是其中蕴藏很深的玄机,请看如下四个例子,你知道他们答案是多少吗?

?1.

??public static void main(String[] args) {
???? ? int m=0;
????? ?for(int i=0;i<100;i++){
?????? ?????? m=m++;
????? }
????? System.out.println("m="+m);
??}
??2.

?public static void main(String[] args) {
??int m=0;
??for(int i=0;i<100;i++){
???m=++m;
??}
??System.out.println("m="+m);
?}

3.

? ?public static void main(String[] args) {
??int m=0;
??for(int i=0;i<100;i++){
???m=i++;
??}
??System.out.println("m="+m);
?}

?4.

?public static void main(String[] args) {
??int m=0;
??for(int i=0;i<100;i++){
???m=++i;
??}
??System.out.println("m="+m);
?}

?

? 自己可以先运行看看,答案是:0,100,98,99.

?

为什么呢? 一个一个来

(1) m=m++,可以这样理解,首先看后面,m在前,是先用再加,m一直在用,所以每次赋值都无效!!!所以一直还是原来的值,即0。点评,这个很变态...

(2)m=++m,首先还是看后面,+在前,先加再用,即先加个一,再赋值,所以每次都改变,当i=0的时候,m=1,当i=99,m=100.怎么快速得到呢,即m=(99-0)+1嘛!点评,这个,有点技术含量。

(3)照一般理解可能会选99或者100,偏偏是98!!!先说玄机,for循环中应该是一旦判断i=99就停止了,所以无论何时何地,注意,比如for(int i=0;i<变量上限;i++),无论for循环中任何对i的赋值行为都有效,而且for每次要往下前,都会判断

i是否已经为变量上限-1,如果已经达到,那么不会往下执行!所以执行到i=98后,m先用98,i自己加自己,和m无关,最后

m=98. 点评,这个,,,主要是m=98那么很容易搞错。

(4)和3道理一样,i到98,因为是先加再用,最后一次i=98,加1后为99,所以最终m=99.点评,这个和(3)一样容易搞错。

?

总结:

(1)遇到又自加又赋值的表达式,一定要仔细研究,最好自己debug一下,看下结果具体是怎么样的。说实在话,我第一次做,全错。

(2)i++后还进行赋值是一种不严谨的操作方式,在c语言中已经被认为是不稳妥的。尽量在自加后不要乱赋值,比如1可以改写为m=m+1,那么肯定是100.

(3)for循环尽量不要对循环变量赋值和自加,自减.如果要计算的话,可以取个临时变量先接受i的值,比如,3可以改为

?public static void main(String[] args) {
??int m=0;
??for(int i=0;i<100;i++){
???int temp=i;
???temp++;
???m=temp;
???
???
??}
??System.out.println("m="+m);
?}

?那么结果肯定也是100.

1 楼 promzaid 2011-11-07  
第一个不是很理解

m=m++;

分解成

m=m;
m=m+1;
2 楼 nannan408 2011-11-13  
promzaid 写道
第一个不是很理解

m=m++;

分解成

m=m;
m=m+1;

1.主要是这种先自加再赋值的情况很少用,它保留了c语言的对于自加的运算顺序(世界上是先有c语言,诞生于1971年,再有java,诞生于1990年)。这种运算顺序就是,如果又有自加,又有等号赋值,那么必须分两种情况:(1)m++,m在前,这种是先用再加
                                        (2)++m,+号在前,这种是先加再用。
第一个例子属于第一种情况,是先用再加
                          m=m  ;//此步是真正赋值,已经实现赋值,不管后面了
                      m=m+1; //此步只是实现自加效果,并没有赋值。

2.这个问题产生的根源是等号和自加用在了一起,单独的m++,和++m,m的值一定会改变的,一定是m=m+1。但是无论m=m++,m=++m,都已经不在是单纯的关系运算和赋值运算了,这个属于约定的逻辑运算,只要知道运算顺序,就好办了。运算顺序就是
                                        (1)m++,m在前,这种是先用再加
                                        (2)++m,+号在前,这种是先加再用。