2012-09-11 70 views
-1

我正在學習C,看到下面在im讀的書中列出的第一個循環。我很好奇這兩者之間的區別是什麼,因爲我習慣於使用第二種方法,即使它們返回不同的結果也無法找出差異。這兩個FOR循環有什麼區別?

for(i = 0; i < 10; ++i){} 

for(i = 0; i <= 10; i++){} 
+1

['for'循環後增加和預增加]的可能重複(http://stackoverflow.com/questions/4706199/post-increment-and-pre-increment-in-for-loop) – Joe

+0

循環運行方式沒有變化。變化是''我怎麼得到增量。'關於'前後增量''google' – tez

回答

6

第一個迭代到9,第二迭代到10。就這樣。

前/後增量操作沒有區別。

未優化的兩個版本生成的代碼

for(int i = 0; i < 10; ++i) 
00E517AE mov   dword ptr [i],0 
00E517B5 jmp   wmain+30h (0E517C0h) 
00E517B7 mov   eax,dword ptr [i] 
00E517BA add   eax,1 
00E517BD mov   dword ptr [i],eax 
00E517C0 cmp   dword ptr [i],0Ah 
00E517C4 jge   wmain+53h (0E517E3h) 
    { 
    } 

    for(int i = 0; i <= 10; i++) 
00E517E3 mov   dword ptr [i],0 
00E517EA jmp   wmain+65h (0E517F5h) 
00E517EC mov   eax,dword ptr [i] 
00E517EF add   eax,1 
00E517F2 mov   dword ptr [i],eax 
00E517F5 cmp   dword ptr [i],0Ah 
00E517F9 jg   wmain+88h (0E51818h) 
    { 
    } 

所以,即使在這裏,沒有性能損失。 i++慢於++i的事實並非如此(至少在這種情況下,它沒有什麼區別)。比如說int y = i++會比較慢,但在這種情況下,兩者會做不同的事情,這裏不是這樣。性能問題可能對20年前的編譯器有效,但現在不再有效。

+0

「它會比較慢,比如'int y = i ++;'' - 我沒有認爲你可以確定這比'int y = ++ i;'慢。我想這可能取決於哪些操作碼可用於執行增量操作,但基本上這兩個語句都會增加'i',並在增量之前或之後將其值複製到'y'。是否有任何普遍的理由認爲在增量之前複製比複製之後複製昂貴? –

+0

@SteveJessop你說得對,即使不是那樣,但我確定有些情況確實是後增加速度較慢,但​​與這種情況無關。 –

+0

順便說一句,當任何一個工作,我更喜歡'++我'爲非性能相關的原因。所以我對性能的主張非常感興趣,以防某些性能問題會破壞我的風格偏好;-) –

0

第一次將運行10次。第二個將運行11次。

1

在第一個你有預增量,第二個有一個後增量。

的唯一的事情是條件,即在第一個要檢查高達9和第二的高達10

在這兩個循環遞增運算使得在這種情況下沒有區別

+0

我見過程序員更喜歡++我出於同樣的原因 – Cdeez

+0

70歲的程序員使用Turbo C嗎? –

+0

只是一個參考:回答[這](http://stackoverflow.com/questions/4706199/post-increment-and-pre-increment-in-for-loop)和評論,回答者張貼(得到6 upvotes太)。所以我認爲有些人會像我一樣思考。 – Cdeez

1

的前/後增量操作將在你使用它們的同時幫助值。

i=10; 

j = i++; 

這裏的i值將是11,但是,的j值將是10。因爲i值被分配給j即後增量

i=10; 

j = ++i; 

這裏值之後將遞增的i將是11,並且j的值也將是11.因爲i將在價值被分配給j之前遞增e Pre Increment

0

大多數人已經聲明迭代次數相差一次,前後增量在這裏沒有任何區別。

對於c,我會說第一個循環是你更常遇到的。我認爲這是因爲c使用從零開始的數組,因此數組的最大值(或字符串,因爲它是一個字符數組)不會用作數組中的索引(這將超出範圍)。因此,在本例中,當循環訪問長度爲10的數組時,第一個循環將更符合邏輯,因爲您可以安全地使用i作爲數組的索引。第二個循環會導致錯誤(可能是分段錯誤)。

你說你習慣第二個。我不知道你爲什麼習慣這樣做,但我假設一些其他的編程語言,或者在數學中,循環(總和等)運行到極限(但通常從一開始)。在這種情況下,基於零的指數可能會有點令人沮喪。

簡而言之,根據我的經驗,您會更經常地發現第一個循環,但第二個循環有很多用例。

至於++ii++:我傾向於後者,因爲for語句的這部分發生在循環的結尾。後綴表示法因此更合乎邏輯。但再一次,這並不重要。