簡體   English   中英

使用增量運算符時的不同結果(arr[i++] vs arr[i]; i++;)

[英]Different results when using increment operator (arr[i++] vs arr[i]; i++;)

我不明白為什么下面的代碼沒有按預期工作:

#include <stdio.h>

int main() {
    int i = 0, size = 9, oneOrZero[] = {1,1,1,1,1,1,1,1,0};
    while (i < size && oneOrZero[i++]);
    if (i == size) printf("All ones"); else printf("Has a zero");
}
Terminal: All ones.

當增加循環內的索引時,代碼按預期運行:

#include <stdio.h>

int main() {
    int i = 0, size = 9, oneOrZero[] = {1,1,1,1,1,1,1,1,0};
    while (i < size && oneOrZero[i]) {i++;}
    if (i == size) printf("All ones"); else printf("Has a zero");
}
Terminal: Has a zero.

有人可以解釋這兩者之間的區別嗎?

在第一個代碼中,當i8oneOrZero[i]將評估為false因為oneOrZero[8] == 0 ,但無論如何i都會增加到9 ,增量不依賴於表達式的真實性,它會發生的次數與計算表達式的次數相同。

所以很自然地,當i == size被評估時,它是9 == 9 ,這當然是true ,因此"All ones"將被打印出來給你錯誤的輸出。

在第二個代碼中, i在條件表達式的主體內遞增,這意味着它只會在滿足條件時遞增,因此當i8oneOrZero[i]將評估為false並且i不遞增,保留其8值。

在下一行語句中, i == size將是8 == 9 ,這是false並且將打印"Has a zero" ,為您提供正確的輸出。

當使用迭代索引i也進行檢查(與size比較)時,這是典型的逐一錯誤。 不用擔心,幾乎每個人都會遇到這種情況。

問題是,即使條件失敗,我們也已經改變了oneOrZero[i++]的結果( i )。 我們的第二個變體不會落入這個陷阱,因為條件和索引增量是解耦的。

我們可以用一個更簡單的例子來復制這種行為:

#include <stdio.h>

int main() {
    int i = 0, size = 1, oneOrZero[] = {0};
    while (i < size && oneOrZero[i++]);
    if (i == size) printf("All ones"); else printf("Has a zero");
}

現在,讓我們手動檢查條件:

  1. i < size很好,所以我們繼續評估右側。
  2. i++增量i1 (又名size
  3. oneOrZero[0]0 ,因此條件失敗

在這個單次迭代之后, i == size ,我們打印All ones


將此與其他變體進行比較:

int main() {
    int i = 0, size = 1, oneOrZero[] = {0};
    while (i < size && oneOrZero[i]) {i++;}
    if (i == size) printf("All ones"); else printf("Has a zero");
}

再次,我們檢查條件:

  1. i < size很好
  2. oneOrZero[0] == 0 ,所以我們停止。
  3. i永遠不會增加

因此i < size並且我們打印Has a zero


請注意,可以將條件更改為

int i = -1;

while(++i < size && oneOrZero[i]);

但這需要仔細的文檔。

   #include <stdio.h>
        
        int main() {
            int i = 0, size = 9, oneOrZero[] = {1,1,1,1,1,1,1,1,0};
            while (i < size && oneOrZero[i++]);
            if (i == size) printf("All ones"); else printf("Has a zero");
        }

上面的代碼執行直到i = 8並且第一個條件i < size8 < 9但第二個條件oneOrZero[8]false 無論如何,我將增加到 9。9 9 == 9所以它會打印"All ones"會打印給你錯誤的輸出。

#include <stdio.h>

int main() {
    int i = 0, size = 9, oneOrZero[] = {1,1,1,1,1,1,1,1,0};
    while (i < size && oneOrZero[i]) {i++;}
    if (i == size) printf("All ones"); else printf("Has a zero");
}

上面的代碼執行直到i = 8並計算為i < size and 8 < 9oneOrZero[i] oneOrZero[8] = 0並計算為false並退出循環和i == size 8 == 9並打印將打印Has a zero ,為您提供正確的輸出。

暫無
暫無

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

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