java中:
采用中間變量機制:
i = i++;相當於:
temp = i;
i = i + 1;
i = temp; (即i = i++ = temp)## 注:在二元操作符(“=”、“+”)對應的指令生成之前生成一個自增指令(即:在 “+” 和 “=” 運算執行前,就已經自增了)。##
問題實質:在java中,執行自增運算時,會為每一個自增操作分配一個臨時變量,如果是前綴加(++i),就會“先自加1後賦值(給臨時變量)”;如果是後綴加(i++),就會“先賦值(給臨時變量)後自加1”。運算最終使用的,並不是變量本身,而是被賦了值的臨時變量。
=================================================================================================
int a = 0,sum;java中,是使用完 a++ 這個表達式後,a立即加一;
對於sum = a++ + a++;java中:第一個a++執行完後,a的值立即加一變成1,在第二個a++執行之前,a的值為1
a = 0;
a = a++ + a++;temp1 = a; --> temp1 == 0;
a = a+1;
temp2 = a; --> temp2 == 1;
a = a+ 1;
a = temp1 + temp2;
=================================================================================================
int a = 0, sum;
a = a++;
System.out.println(a);結果是:0 注:變量 a 的值的變化過程是:0 --> 1 --> 0 (初始化為0 --> a自增為1 --> 把臨時變量的值 1 賦值給a)
------------------------------------------------------------------------------------------------------------------------------------------int a = 0, sum;
sum = a++ + a++;
System.out.println(sum);
System.out.println(a);結果是:1和2
--------------------------------------
int a = 0, sum;
a = a++ + a++;
System.out.println(a);
結果是:1
--------------------------------------
int a,sum;
a = 0;sum = a++ + ++a;
System.out.println(sum);
System.out.println(a);結果是:2和2
================================================================================================================
C語言中:
++ 是一元運算符:+ 與 = 都是二元運算符
對於一元操作符來說,其返回值為:i++為i的值,++i是i加一後的值
i++ 操作意味著 在二元操作符對應的指令生成之後再生成一個自增指令(即:在 “+” 和 “=” 運算都結束後,才自增)。
++i 操作意味著 在二元操作符對應的指令生成之前生成一個自增指令(即:在 “+” 和 “=” 運算執行前,就已經自增了)。
================================================================================================================
int i = 0, sum;// 測試一元運算符
若 printf("%d", i); 結果是:0
若 printf("%d", i++); 結果是:0
若 printf("%d", ++i); 結果是:1
----------------------------------------------------------------------
int i = 0, sum;// 測試二元運算符
sum = i++;
printf("%d", sum);
printf("%d", i);結果是:0和1
若改為:
i = i++;
printf("%d",i);則結果是:1
----------------------------------------------------------------------
int a = 0, sum;
sum = a++ + a++;printf("%d\n",sum);
printf("%d\n",a);結果是:0和2
分析:
先執行第一個a++(此時,a的值為0),
再執行第二個a++(此時,a的值為0),
最後執行加法運算和賦值運算(此時,a的值為0,sum的值為 0 + 0 = 0),
加法運算結束後,執行a的兩次加一動作(此時a的值為2)
若改為:
a = a++ + a++;
printf("%d", a);
則結果是:2
----------------------------------------------------------------------
int a = 0,sum;a = a++ + ++a;
printf("%d\n",a);過程:
首先,a 自增1,這是由 ++a 帶來的(即使 a++ 在最左邊)。這時 a = 1然後,我們計算 + 號的兩個操作數。
因為它們其實都是 a(這裡就涉及到編譯器實現的問題了,大多數C編譯器會將這兩個操作數合並,即都是變量a),
值都為1,這樣的話 a++ + ++a 的返回值是1+1=2,接著把 a++ + ++a 的值賦值給a,此時 a = 2最後,完成 a++ 帶來的自增指令,此時 a 的值為 2+1=3,這是 a = 3
結果是:3
若改為:
sum = a++ + ++a;
printf("%d",sum);
printf("%d", a);
過程:
首先,a 自增1,這是由 ++a 帶來的(即使 a++ 在最左邊)。這時 a = 1然後,然後,我們計算 + 號的兩個操作數。
因為它們其實都是 a(這裡就涉及到編譯器實現的問題了,大多數C編譯器會將這兩個操作數合並,即都是變量a),
值都為1,這樣的話 a++ + ++a 的返回值是1+1=2,接著把 a++ + ++a 的值賦值給sum,此時 sum = 2,a = 1最後,完成 a++ 帶來的自增指令,此時 a 的值為 1+1=2,這是 a = 2
結果為:2和2
================================================================================================================
a = a++ ++a; 在 java 中和 C 中的區別
java 中,先執行 a++,
C中,先執行 ++a