2016/4/26

Java i++ ++i 差別 指定運算

先來釐清簡單的

i++也是i = i + 1

i--也是i = i - 1

範例1:

int i = 0;
i = i + 1;
System.out.println(i);
i = i - 1;
System.out.println(i);

執行結果:

1

0

範例2:
1
2
3
4
5
int i = 0; 
i = i + 1; 
System.out.println(i); 
i = i - 1;
System.out.println(i);

執行結果:
1
2

重頭戲來了,範例3:
1
2
3
4
5
6
7
8
9
10
11
12
int i = 0;
System.out.println(i++);
System.out.println(i);
i = 0;
System.out.println(++i);
System.out.println(i);

//結果:
//  0
//  1
//  1
//  1
說明:先看第2行,可看成它是先印出System.out.println(i++);也就是還沒變化的值,所以這的i是0,印出來了再執行後面的System.out.println(i++);

所以第3行,印出1

第4行歸0

第5行整行直接執行ㄧSystem.out.println(++i);執行和印出在這一行一起做,所以印出1

第6行,都加完了,再印一次當然還是1

結論:i++是先給值再+,++i是先加再給值


指定運算

指定運算子範例結果
+=a += ba = a + b
-=a -= ba = a - b
*=a *= ba = a * b
/=a /= ba = a / b
%=a %= ba = a % b
&=a &= ba = a & b
|=a |= ba = a | b
^=a ^= ba = a ^ b
<<=a <<= ba = a << b
>>=a >>= ba = a >> b

再看一個例子例4,中興105資科所考題:
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
#include <stdlib.h>
int main(){
    int a = 10;
    int b = 2;
    printf("%d\n",(a++)+b);
    printf("%d\n",(++a)+b);
    printf("%d\n",(a++)+b);
    printf("%d\n",(++a)+b);
}
試著自己做作看,反白看解答:
12
14
14
16
第六行:依照上面的說法,印的時候++不做,只做a+b所以12,但這行做完a就做++了,所以這行結束後a=11,我是理解為6.5行這裡它自己偷偷做++。
第七行:注意!!這裡a已經是11,所以++a同時印同時做++,(++a)=12,12+2=14。
試問所以這行最後a是多少?是12!並沒有7.5行才++這種事,因為它是先加!!
第八行:再問,這裡a是多少?還是12,上面講過不說了。所以(12++)+2,印出14。
然後在8.5行偷做++,所以結束時a是13。
第九行:先問,a是多少?這裡問的是這行還沒運算前a是多少,答是13。所以(++a)+b。(++a)做完14,再加b就是16。

可惜當時這++概念沒搞懂,所以沒有拿到分...

沒有留言:

張貼留言