今天在網上看到一篇文章,看到評論,挺有意思的,所以就在此再來回顧一下
題目如下所示,求出打印i的值:
1 public static void main(String[] args) { 2 int i = 0; 3 for (i++; i++ < 10; i++); 4 System.out.println(++i); 5 6 }
此問題主要就是考的對++i與i++的區別,對於這兩者的區別,我們可以這樣理解。就好比是電費付費的問題,有兩種付費情況:一種是先付費,意思就是先交錢才給電用;一種是后付費,意思就是先用着電,下一個月再交錢。當然,現在的電費好像都是先付費吧。
先來看++i和i++,我們可以把++i看成是電費的先付費,i++看成是電費的后付費,兩個加號在前面的就是先付費,在后面的就是后付費,這樣也比較好記住。記住了,但也要理解,看看怎么理解呢。++i 先加1再運算(先交電費才給用電)結果為i+1,i++先運算再加1(先用電下月再交錢)結果為i。
理解了之后,我們再來看看題目,求出打印i的值。先看第三行的for循環中的條件
i++;i++<10;i++
i的初始值為0,條件中的第一部分i++,結果為0,運算之后會加1;i++<10;到這兒i就為1,i++<10,結果為1<10,滿足條件,i在運算之后會加1;條件中的第三部分i++,結果為2。這是第一次循環,下面用簡單的表示方式,列數字分別表示相應列的i
第一次循環 0;1;2 (循環體中輸出i的結果為2)
第二次循環 2;3;4 (循環體中輸出i的結果為4)
第三次循環 4;5;6 (循環體中輸出i的結果為6)
第四次循環 6;7;8 (循環體中輸出i的結果為8)
第五次循環 8;9;10 (循環體中輸出i的結果為10)
第六次循環 10;11;12 (此時11<10條件不成立,for循環體中代碼不執行,跳出循環,但i的結果仍為12)
再來看看循環體外的第4行 System.out.println(++i); ++i這是先付費,得先交錢再用電,也就是先加1再運算,那么結果就是12+1=13
下面再來看另一種情況,加號在前面:
1 public static void main(String[] args) { 2 int i = 0; 3 for (++i; ++i < 10; i++); 4 System.out.println(++i); 5 }
第一次循環 1;2;3 (循環體中輸出i的結果為2)
第一次循環 3;4;5 (循環體中輸出i的結果為4)
第一次循環 5;6;7 (循環體中輸出i的結果為6)
第一次循環 7;8;9 (循環體中輸出i的結果為8)
第一次循環 9;10;11 (此時10<10條件不成立,for循環體中代碼不執行,跳出循環,但i的結果仍為10)
再來看看循環體外的第4行 System.out.println(++i); ++i這是先付費,得先交錢再用電,也就是先加1再運算,那么結果就是10+1=11
需要注意的是:第一種情況每次循環i是先運算再加1到循環體,所以第4行打印語句中的i是等於i+1,例如第一次循環(i=1+1),而第二種情況的每次循環是先加1再運算到循環體,所以第4行打印語句中的i是等於i,例如第一次循環(i=2)
