簡體   English   中英

為什么 ++i, i++ 在 for 循環中是一樣的?

[英]Why ++i, i++ are the same in for loop?

for (int i = 0; i < n+1; ++i)
{
    sum = sum + i;
}

for (int i = 0; i < n+1; i++)
{
    sum = sum + i;
}

兩段因 function 調用參數中的 ++i 和 i++ 而不同。

但它就像 i 只以 0 開頭一樣工作。為什么甚至 ++i 也以 0 開頭?

這兩個片段之間絕對沒有區別。 i++++i僅在與同一表達式中的其他運算符混合時才有意義。 大多數時候這是一個壞主意,因為i++ / ++i帶有副作用。

一個通用for循環,如

for (a; b; c)
{
    d
}

相當於

{
    a;
    while (b)
    {
        d;
        c;
    }
}

請注意“增量”表達式c是如何位於循環體的主語句之后的。

對於您的循環,這意味着它們將等效於:

{
    int i = 0;
    while (i < n+1)
    {
        sum = sum + i;
        i++;  // or ++i
    }
}

由於i的增量直到您計算sum之后才會發生,因此循環之間沒有實際差異。 兩者都會導致完全相同的結果。


附帶說明:請記住在循環之前將sum顯式初始化為零,否則它可能具有不確定的值(可能被視為垃圾)。

您發布的兩個 for 循環的行為完全相同。 它們相等的原因,也回答了為什么兩個循環都從0開始的問題,是增量( i++++i )僅在 {} 中的{expression}執行發生,並且在每次執行后發生.

您的代碼將產生相同的結果。

下面的代碼會產生不同的結果。

int i = 0;
while (i < 5) {
  printf("%d\n", ++i);
}
// 1
// 2
// 3
// 4
// 5
i = 0;
while (i < 5) {
  printf("%d\n", i++);
}
// 0
// 1
// 2
// 3
// 4

在我的示例中,底部 for 循環打印出 0 而頂部 for 循環不打印的原因是因為printfi++/++i形成一個組合表達式,其中頂部i遞增,然后從 memory 訪問,而在底部循環i是從 memory 訪問,然后遞增。

這些for循環的最后一個子句中的i++++i表達式都將i遞增作為副作用,並且由於未使用表達式的值,因此它們具有完全相同的效果,即副作用。

以下是其他替代方法,它們的行為相同並且應該產生相同的代碼:

for (int i = 0; i < n+1; i += 1) {
    sum = sum + i;
}

for (int i = 0; i < n+1; i = i + 1) {
    sum = sum + i;
}

但是請注意,如果n是值為INT_MAXint ,則n+1具有未定義的行為。 編寫此循環的一種更安全的方法是:

for (int i = 1; i <= n; i++) {
    sum = sum + i;
}

但是<=運算符在nINT_MAX時存在相同的問題:當i達到INT_MAX時,未定義的行為將發生在i++部分...

這是避免這種極端情況的替代方法:

if (n > 0) {
    for (int i = 1; i < n; i++) {
        sum = sum + i;
    }
    sum = sum + n;
}

暫無
暫無

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

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