簡體   English   中英

為什么在for循環中“ ++ i”和“ i ++”之間沒有區別?

[英]Why is there any difference between “++i” and “i++” in a for loop?

在我看來,這

for(int i = 0; i < 2; i++)

for(int i = 0; i < 2; ++i)

不應該做同樣的事情。 對於第二個示例,對我來說,自循環開始以來,我應等於1更具邏輯性。

在一些處理器上,例如PDP-11,VAX-11和68K,某些指令的模式等效於*ptr++*--ptr 根據編寫代碼的確切方式,編譯器利用這些指令可能很容易,也可能不太容易-因此,使用*++ptr*ptr++的“正確”變體[更好的是取決於在這些特殊情況下,循環內的使用可以使性能有很大的不同。 但是,對於ARM和x86(我認為,PowerPC和MIPS,幾乎涵蓋了所有現代處理器),這種類型的結構無論如何都不是指令集的一部分,如今,編譯器比以前聰明得多,例如10或20年前。

對於基本類型,任何合理的編譯器都將執行相同的操作, i++++i並不是問題。

如果我們有一個“復雜的”類型,例如帶有operator++(int)opterator++()的結構或類,則可能會有很小的差異[或者在極端情況下,會有很大的差異],因為必須復制對象。 假設我們有一個bigmath ,而我們的i是1000位數長的值。 現在,我們必須在增量的中間制作1000個數字的(n個額外的)副本。 如果編譯器能夠“理解”正在發生的事情,則它可能會刪除該副本,但不能保證會發生。

在我看來,他們應該做完全相同的事情。 兩者都有增加i的作用。

唯一的區別是表達式的 i++給出增量之前的值,而++i給出增量之后的值。 但是在這種情況下,該值將被丟棄,並且僅對表達式的副作用進行評估。 因此,代碼的效果沒有區別。

在某些情況下(如果i不是int而是某些用戶定義的類型,並且帶有重載的運算符,這對於編譯器來說太復雜了), ++i可能會更高效。 這是因為i++需要進行復制以返回舊值,而++i僅需要返回對新值的引用。 而且,當然,足夠瘋狂的用戶定義類型可能會使兩個重載做完全不同的事情。 但是對於簡單類型,也沒有任何區別。

在您的示例中: 沒有區別。 如果類型是用戶定義的類型,則可能會有很大的差異。

至於哪個更合乎邏輯,無疑是一個有爭議的問題。 建議您采用團隊風格或適合您的工作方式。

盡管在考慮返回值時++ii++具有不同的功能,但是在幾乎每種情況下,編譯器都會將i++優化為for循環的++i

如果您不知道有什么區別,則++i遞增,然后返回新i的值,而i++遞增,然后返回舊i的值。 前者在技術上效率更高,因為您不必存儲中間值,但是總的來說,除非您嘗試編寫代碼並使用返回值,否則它們實際上並沒有太大區別。

在您的上下文中,是相同的。 ++ii++之間的區別在於操作順序。 如果您是一個瘋狂的邪惡的C程序員,則可以編寫如下代碼:

int i = 3;
if( ++i++ == 4 ) 
    printf( "%d\n", i);

將輸出

5

因為如果在if測試中我將為4,但在測試之后立即為5。

但是不要那樣做。

我的講師在第一學期竭盡全力向全班解釋。 我記得我很確定它的來龍去脈與“ return”值有關,例如:

++ i將遞增i的值,並返回遞增的值,直到操作完成為止。盡管i ++也會遞增該值,但如果在操作過程中調用該變量,它將返回未遞增的值。

因此,如果您有以下內容:

a = 1;
b = ++a;
c = 10;
d = c++;

那么值將是

a = 2
b = 2
c = 11
d = 10

(之所以這樣是d,是因為c返回的是“后” ++,而不是通常的“前” ++)。

在循環中,絕對沒有區別,因為增量在循環語句中,而不是在其后的操作中。 唯一會有所作為的時間是

for(i = 0; i<5;)
    printf("%d ",++i);

其中不會打印0值,而將打印5值,因為在打印操作期間其值增加了。

像泥一樣清澈嗎?? 不要問我為什么將其編程為C! 在我看來,這似乎是多余的,而且會彈出的東西很少,任何需要它的程序都可以通過增加一行代碼來更改另一個變量中的值來解決問題!

在您的情況下,這是相同的,因為未使用表達式的返回值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM