[英]What is the difference between pre-increment and post-increment in the cycle (for/while)?
我的興趣在於for
和while
循環之間的區別。 我知道使用后增量值然后遞增,並且操作返回一個常量前增量。
while (true) {
//...
i++;
int j = i;
}
在這里, j
將在循環結束時包含舊的i
還是后遞增的i
?
由於語句 i++ 結束於;
在您的示例中,無論您使用前增量還是后增量都沒有區別。
當您使用結果時會出現差異:
int j = i++; // i will contain i_old + 1, j will contain the i_old.
對比:
int j = ++i; // i and j will both contain i_old + 1.
取決於你如何使用它們。
i++
創建一個副本,增加 i,並返回副本(舊值)。++i
增加 i,並返回 i。 在您的示例中,這完全與速度有關。 ++i
將比i++
更快,因為它不會復制。
但是,編譯器可能會將其優化掉,因為您沒有在示例中存儲增量運算符的返回值,但這僅適用於int
等基本類型。
理解的基本答案。 遞增運算符的工作方式如下:
// ++i
function pre_increment(i) {
i += 1;
return i;
}
// i++
function post_increment(i) {
copy = i;
i += 1;
return copy;
}
當一個好的編譯器檢測到返回的值不會被使用時,它會自動將i++
替換為++i
。
在預增量中,初始值首先遞增,然后在表達式中使用。
a = ++i;
在這個例子中,假設變量i
的值為 5。那么變量a
的值為 6,因為i
的值在在表達式中使用之前已被修改。
在后增量中,值首先在表達式中使用,然后遞增。
a = i++;
在此示例中,假設變量i
的值為 5。那么變量a
值將是 5,因為i
的值僅在將值 5 分配給a
后才會增加。
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char **argp)
{
int x = 5;
printf("x=%d\n", ++x);
printf("x=%d\n", x++);
printf("x=%d\n", x);
return EXIT_SUCCESS;
}
程序輸出:
x=6
x=6
x=7
在第一個 printf 語句中,x 在傳遞給 printf 之前遞增,因此輸出值 6,在第二個 x 傳遞給 printf(所以輸出 6)然后遞增,第三個 printf 語句僅顯示前一個后遞增通過再次輸出 x 現在的值 7 來聲明。
i++ 使用 i 的值然后遞增它,但 ++i 在使用它之前遞增 i 的值。
在許多情況下,后增量和前增量之間的差異確實很微妙。 post incremenet,又名num++
,首先創建num
的副本,返回它,然后遞增它。 另一方面,預增量又名++num
,首先計算,然后返回值。 大多數現代編譯器,當在循環中看到這一點時,通常會優化,主要是在使用后增量時,並且不使用返回的初始值。 兩個增量之間的最大區別(通常會產生細微的錯誤)是在聲明具有增量值的變量時:示例如下:
int num = 5;
int num2 = ++num; //Here, first num is incremented,
//then made 6, and that value is stored in num2;
另一個例子:
int num = 5;
int num2 = num++; //Here, num is first returned, (unfortunately?), and then
//incremented. This is useful for some cases.
我想說的最后一件事是小心增量。 聲明變量時,請確保使用正確的增量,或者只寫出整個內容( num2 = num + 1
,這並不總是有效,相當於預增量)。 如果您使用正確的增量,將會省去很多麻煩。
在獨立語句中使用前置增量還是后置增量都沒有關系,除了前置增量,效果是即時的
//an example will make it more clear:
int n=1;
printf("%d",n);
printf("%d",++n);// try changing it to n++(you'll get to know what's going on)
n++;
printf("%d",n);
輸出:123
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.