簡體   English   中英

i++ 和 ++i 的區別

[英]Difference between i++ and ++i

因此,我知道 i++ 在條件滿足后遞增,而 ++i 在條件滿足之前遞增。 這讓我想到了我的問題:

#include<stdio.h>
int main()
{
    int i=0;
    while(++i<10)
        printf("%d\n",i);
    return 0;
}

現在在這里我們需要從 0 開始初始化 i,因為當它進入 while 循環時,它會首先遞增,因此它就像 while(1<10),所以它會打印從 1 到 10 的數字。

第二個代碼:

#include<stdio.h>
int main()
{
    int i=0;
    while(i++<10)
        printf("%d\n",i);
    return 0;
}

現在既然 i++ 在值被使用后遞增,那么為什么我們要從 i=0 初始化 i,就好像它在 i 的值比較后遞增一樣,那么為什么不打印 0 也是因為第一個循環應該 go 像 while(0<10),而不像 while(1<10)? 那么,為什么零沒有被打印出來?

感謝您的時間。

零不會打印,因為i在比較之后立即遞增,如下所示:

while(i<10) {
    i += 1;
    printf("%d\n",i);
}

你問題的第一句話幾乎就是答案:

i++在條件滿足后遞增

它在檢查條件后遞增,因此i++ < 10將遞增i無論條件是真還是假。

前增量和后增量的差異僅適用於表達式計算的值。

i++<10的求值完成后,自增也完成,第一次迭代i的值為1

printf("%d\n",i); i++<10的評估之后執行,所以i在第一次迭代中的值為1

是的,第一個條件將評估為0 < 10 您可以通過將其更改為while (i++ < 1)來驗證這一點,並看到循環仍然運行(一次),因此很明顯它使用 0 作為條件(當然1 < 1將是錯誤的)。

那么為什么打印 1 呢? 因為它不打印用於條件的任何值。 它打印i的當前值。 並且此時i的當前值為 1,因為i在條件中使用后立即遞增。

i++結果i的值。 作為副作用i增加了。

++i的結果是i + 1的值。 作為副作用, i增加了。

該聲明

x = i++;

邏輯上等價於

tmp = i;
x = tmp;
i = i + 1;

需要注意的是,對xi的分配可以以任何順序發生,甚至可以同時發生(交錯或並行)。

同樣,聲明

x = ++i;

邏輯上等價於

tmp = i + 1;
x = tmp;
i = i + 1;

與上述相同的警告。 同樣,這些是邏輯等價物,而不是編譯器實際生成的 - 取決於編譯器和涉及的代碼可能不是臨時的。

++的操作不是在它所在的任何“條件”之前或之后完成的。它必須在它所在的完整表達式中或周圍的某個時間完成。說i的答案是在“之前”或“之后”更新的++ii++被評估是不正確的。

前綴++i做了兩件不同的事情,可能以任何順序發生:

  • 它在添加一個后評估i的值。
  • 它將 i 的存儲值加i

Postfix i++做了兩件不同的事情,可能以任何順序發生:

  • 它在添加一個之前評估i的值。
  • 它將 i 的存儲值加i

i的存儲值的更改稱為副作用 它與表達式的主要評估斷開連接。 它可以在i的評估之前、期間或之后執行,但評估仍然返回前或后增量值,如上所述。

完整表達式是不包含在另一個表達式中的表達式。 因此,在while (++i < 10)中, ++i < 10是一個完整的表達式。 副作用可能發生在計算任何部分之前、計算i加一的值之后或計算<之后。 它也可以在評估期間部分發生(例如逐個更新i的字節)。 但是,副作用必須發生在任何先前的完整表達式之后和任何以后的完整表達式之前。 這是因為 C 標准規定在任何兩個完整表達式之間都有一個序列點。 (還有一些關於執行順序的其他規則。)

即使i的存儲值在i++之前或++i之后更新,表達式仍必須分別在增量之前或之后產生i的值。 例如,對於i++ ,編譯器可以獲取i 、加一、存儲i ,然后在表達式中使用預加值。

在第二個代碼中,增量將發生在條件之后但在打印語句之前。

因此,打印了i的增量值。

這是您用簡單語言的答案。

暫無
暫無

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

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