このCコードを考えてみましょう。
#include "stdio.h"
int main(void) {
int count = 5;
unsigned int i;
for (i = count; i > -1; i--) {
printf("%d\n", i);
}
return 0;
}
私の観察/質問:ループは決して実行されません。しかし、iのデータ型をunsigned intからintに変更すると、すべてが期待どおりに機能します。
私は、符号なしintを、減算を続けようとすると「ラップアラウンド」する値と考えてきました。したがって、iがゼロで1を引くと、UINT_MAXにラップアラウンドします。そして、その値が負になることは決してないので、これは事実上無限ループになります。(そして、これは、比較をi>-1からi>= 0に変更したときに起こることです。)
ロジックのどこかに障害があります。iが符号なしの場合、ループが実行されることはなく、-1と比較しています。コンパイラが何らかの方法でそれを最適化するか、実行時の値が私が期待するものとは異なる動作をするかのどちらかです。
ループが実行されないのはなぜですか?