![](/img/trans.png)
[英]Behaviour of arr[i] = i++ and i = i + 1 statements in C and C++
[英]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.
有人可以解釋這兩者之間的區別嗎?
在第一個代碼中,當i
為8
, oneOrZero[i]
將評估為false
因為oneOrZero[8]
==
0
,但無論如何i
都會增加到9
,增量不依賴於表達式的真實性,它會發生的次數與計算表達式的次數相同。
所以很自然地,當i == size
被評估時,它是9 == 9
,這當然是true
,因此"All ones"
將被打印出來給你錯誤的輸出。
在第二個代碼中, i
在條件表達式的主體內遞增,這意味着它只會在滿足條件時遞增,因此當i
為8
, oneOrZero[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");
}
現在,讓我們手動檢查條件:
i < size
很好,所以我們繼續評估右側。i++
增量i
到1
(又名size
)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");
}
再次,我們檢查條件:
i < size
很好oneOrZero[0] == 0
,所以我們停止。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 < size
是8 < 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 < 9
但oneOrZero[i]
oneOrZero[8] = 0
並計算為false
並退出循環和i == size
8 == 9
並打印將打印Has a zero
,為您提供正確的輸出。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.