我正在學習C,看到下面在im讀的書中列出的第一個循環。我很好奇這兩者之間的區別是什麼,因爲我習慣於使用第二種方法,即使它們返回不同的結果也無法找出差異。這兩個FOR循環有什麼區別?
for(i = 0; i < 10; ++i){}
for(i = 0; i <= 10; i++){}
我正在學習C,看到下面在im讀的書中列出的第一個循環。我很好奇這兩者之間的區別是什麼,因爲我習慣於使用第二種方法,即使它們返回不同的結果也無法找出差異。這兩個FOR循環有什麼區別?
for(i = 0; i < 10; ++i){}
for(i = 0; i <= 10; i++){}
第一個迭代到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年前的編譯器有效,但現在不再有效。
「它會比較慢,比如'int y = i ++;'' - 我沒有認爲你可以確定這比'int y = ++ i;'慢。我想這可能取決於哪些操作碼可用於執行增量操作,但基本上這兩個語句都會增加'i',並在增量之前或之後將其值複製到'y'。是否有任何普遍的理由認爲在增量之前複製比複製之後複製昂貴? –
@SteveJessop你說得對,即使不是那樣,但我確定有些情況確實是後增加速度較慢,但與這種情況無關。 –
順便說一句,當任何一個工作,我更喜歡'++我'爲非性能相關的原因。所以我對性能的主張非常感興趣,以防某些性能問題會破壞我的風格偏好;-) –
第一次將運行10次。第二個將運行11次。
的前/後增量操作將在你使用它們的同時幫助值。
說
i=10;
j = i++;
這裏的i
值將是11,但是,的j
值將是10。因爲i
值被分配給j
即後增量
i=10;
j = ++i;
這裏值之後將遞增的i
將是11,並且j
的值也將是11.因爲i
將在價值被分配給j
之前遞增e Pre Increment
大多數人已經聲明迭代次數相差一次,前後增量在這裏沒有任何區別。
對於c,我會說第一個循環是你更常遇到的。我認爲這是因爲c使用從零開始的數組,因此數組的最大值(或字符串,因爲它是一個字符數組)不會用作數組中的索引(這將超出範圍)。因此,在本例中,當循環訪問長度爲10的數組時,第一個循環將更符合邏輯,因爲您可以安全地使用i
作爲數組的索引。第二個循環會導致錯誤(可能是分段錯誤)。
你說你習慣第二個。我不知道你爲什麼習慣這樣做,但我假設一些其他的編程語言,或者在數學中,循環(總和等)運行到極限(但通常從一開始)。在這種情況下,基於零的指數可能會有點令人沮喪。
簡而言之,根據我的經驗,您會更經常地發現第一個循環,但第二個循環有很多用例。
至於++i
與i++
:我傾向於後者,因爲for語句的這部分發生在循環的結尾。後綴表示法因此更合乎邏輯。但再一次,這並不重要。
['for'循環後增加和預增加]的可能重複(http://stackoverflow.com/questions/4706199/post-increment-and-pre-increment-in-for-loop) – Joe
循環運行方式沒有變化。變化是''我怎麼得到增量。'關於'前後增量''google' – tez