C與Java ++區別轉載-輸出,Line

來源:互聯網
上載者:User

對i++和++i這兩個運算式所組成的複合運算式都或多或少有些困惑吧,一些編程高手也未必能弄清此中奧妙,本人在CSAI網論壇上看到一組有關JAVA和C/C++中i=i++運算式的研究,發現有所得,現將所獲公佈於此,供大家琢磨研究:
i=i++的結果java 和 c/c++是不一樣的
一、先談後++:
1. java裡, 在運算式運算中,++執行後的結果參加運算式運算。
如果不明白什麼意思,看下面例子:
Example 1:
Line 1: i = 0;
Line 2: System.out.println(i++); //輸出 0;
Line 3: System.out.println(i); //輸出 1;
分析:i++值是0, 但是i++執行後i是1,所以Line 2輸出是0,
Line 3輸出是1.
至於賦值,java 是這樣的, 如 i = i++; 因為從Line 2可以得知i++值是0,
所以 i = i++; 即 i = 0; 而C/C++卻不是這樣的.見C/C++中的說明
Example 2:
Line 4: i = 0;
Line 5: System.out.println(i++ + i++); // 0 + 1; 輸出1
Line 6: System.out.println(i); // 2; 輸出2
分析:Line 5中第一個i++值是0,但是i++ 執行後,i值是1;由於執行到
第二個i++的時候i的值是1,所以第二個i++的值是1,執行後i值是2.
Example 3:
Line 7: i = 0;
Line 8: System.out.println(i++ + i++ + i++); // 0 + 1 + 2; 輸出3
Line 9: System.out.println(i); // 3; 輸出3
分析:Line 8中第一個i++值是0,但是i++ 執行後,i值是1;由於執行到
第二個i++的時候i的值是1,所以第二個i++的值是1, 執行後i值是2; 由
於執行到第三個i++的時候i的值是2, 所以第二個i++的值是2, 執行後i
的值是3
依此類推.
2. 而在C/C++中,後++是在整個運算式運算結束以後進行的.
Example 4:
Line 10: i = 0;
Line 11: printf("%d/n", i++); //輸出 0;
Line 12: printf("%d/n", i); //輸出 1;
分析:i++值是0, 但是i++執行後i是1,所以Line 11輸出是0,
Line 12輸出是1.
上面已經說到後++是在整個運算式運算結束以後進行的.
所以i=i++中的++是在運算式運算結束後進行.
i = 0;
printf("%d/n", i=i++); //i++為0, i=i++ 這是一個運算式,它的值依然是0,輸出 0;
printf("%d/n", i); //i=i++結束後,進行自加,輸出 1;
Example 5:
Line 13: i = 0;
Line 14: printf("%d/n", i++ + i++); // 0 + 0; 輸出0,
Line 15: printf("%d/n", i); // 2; 輸出2,自增兩次
分析:Line 14中i++ + i++是一個運算式,在執行過程中,i不自增加,
待整個運算式執行完畢後,i自增
Example 6:
Line 16: i = 0;
Line 17: printf("%d/n", i++ + i++ + i++); // 0 + 0 + 0; 輸出0
Line 18: printf("%d/n", i); // 3; 輸出3
分析:同上
二、再談前++:
1. java裡, 在運算式運算中,++先執行後,然後執行運算式運算。
如果不明白什麼意思,還得看下面例子:
Example 7:
Line 19: i = 0;
Line 20: System.out.println(++i); //輸出 1;
Line 21: System.out.println(i); //輸出 1;
分析:++i值是1, ++i執行後i也是1,所以Line 20和Line 21輸出結果相同,都是1
Example 8:
Line 22: i = 0;
Line 23: System.out.println(++i + ++i); // 1 + 2; 輸出3
Line 24: System.out.println(i); // 2; 輸出2
分析:Line 23中第一個++i值是1,++i 執行後,i值也是1;由於執行到
第二個++i的時候i的值是1,所以第二個++i的值是2,執行後i值是2
Example 9:
Line 25: i = 0;
Line 26: System.out.println(++i + ++i + ++i); // 1 + 2 + 3; 輸出6
Line 27: System.out.println(i); // 3; 輸出3
分析:同上
依此類推.
2. 在C/C++中,和java中一致,唯一的區別在於使用的寄存器不同,這也有可能導致
最終運算結果不同.可以看一下Example 11 和 Example 12
Example 10:
Line 28: i = 0;
Line 29: printf("%d/n", ++i); //輸出 1;
Line 30: printf("%d/n", i); //輸出 1;
分析:++i值是1,++i執行後i是1,所以Line 29和Line 30輸出都是1
Example 11:
Line 31: i = 0;
Line 32: printf("%d/n", ++i + ++i); // 2 + 2; 輸出4,
Line 33: printf("%d/n", i); // 2; 輸出2,自增兩次
分析:Line 32 的輸出結果有可能大家都比較迷惑,為什麼是2 + 2, 而不是1 + 2.
這裡還得從它的彙編代碼研究.
0040D728 mov dword ptr [ebp-4],0 // i = 0;
0040D72F mov eax,dword ptr [ebp-4]
0040D732 add eax,1 // 第一個 ++i;
0040D735 mov dword ptr [ebp-4],eax // i = 1;
0040D738 mov ecx,dword ptr [ebp-4] //
0040D73B add ecx,1 // 第二個 ++i;
0040D73E mov dword ptr [ebp-4],ecx // i = 2
0040D741 mov edx,dword ptr [ebp-4] // edx 是求和的值,可以看到並不是使用mov edx eax; add edx dword ptr [ebp-4]
0040D744 add edx,dword ptr [ebp-4] // 所以得到的是2+2, 而不是1+2
0040D747 push edx
其實繼續加下去的話,可以清楚地瞭解其中的道理,在Example 12中加以說明
Example 12:
Line 34: i = 0;
Line 35: printf("%d/n", ++i + ++i + ++i + ++i); // 2 + 2 + 3 + 4; 輸出11

Line 36: printf("%d/n", i); // 4; 輸出4
分析: 還得看彙編代碼:
0040D728 mov dword ptr [ebp-4],0 // i = 0;
0040D72F mov eax,dword ptr [ebp-4]
0040D732 add eax,1 // 第一個++i
0040D735 mov dword ptr [ebp-4],eax // i = 1;
0040D738 mov ecx,dword ptr [ebp-4]
0040D73B add ecx,1 // 第二個++i
0040D73E mov dword ptr [ebp-4],ecx // i = 2;
0040D741 mov edx,dword ptr [ebp-4] //注意這裡!!!!!!!
0040D744 add edx,dword ptr [ebp-4] // 在Example 11中有說明,edx 是求和的值,和的值只用了這一個寄存器
//所以第一次 + 運算時就出現了 2 + 2情形, 此時edx即為4
0040D747 mov eax,dword ptr [ebp-4]
0040D74A add eax,1 //第三個 ++i
0040D74D mov dword ptr [ebp-4],eax // i = 3;
0040D750 add edx,dword ptr [ebp-4] // edx = edx + 3 = 4 + 3 = 7;
0040D753 mov ecx,dword ptr [ebp-4]
0040D756 add ecx,1 //第四個 ++i
0040D759 mov dword ptr [ebp-4],ecx // i = 4;
0040D75C add edx,dword ptr [ebp-4] // edx = edx + 4 = 7 + 4 = 11;
0040D75F push edx
結束運算,Line 35輸出結果為11; Line 36 輸出結果為i=4,
依此類推

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.