質問
これは、下に示されている小さなコードであり、それを使用してdoを使用しています。このコードを実行するときに見られる予期しない動作を本当に理解していません。以下に示すこのコードは、doを使用している間、ループ条件を使用します。条件が真であるかどうかの部分。しかし、このコードを実行するとき、それはループから出て永遠に続くことはありません。誰でもなぜそれが起こっているのか教えてください。
unsigned int A = 5;
int B = 0;
main()
{
do
{
A = A + 5;
B = B - 1;
}while(B > A);
printf("hello\n");
}
今、私は「こんにちは」を印刷することはありません。
事前にマディに感謝します
解決
私のために「こんにちは」を印刷します。しばらく時間がかかります(まあ、1、2秒)。
これに変更されました...
void main()
{
unsigned int A = 5;
unsigned int loop = 0;
int B = 0;
do
{
A = A + 5;
B = B - 1;
loop++;
}while(B > A);
printf("hello %d %d %d\n", B, A, loop);
}
印刷物: -
hello -715827882 -715827881 715827882
他のヒント
他の答えが言うように、署名された署名と署名の価値を比較することは悪い考えです(GCCは正しいフラグが与えられた場合、それについて警告します)。あなたが「無限ループ」で立ち往生している理由は署名された値です B
比較の目的のために署名されていないものとして扱われます。初めて到達したとき while(B > A)
, B
IS -1(0で開始され、1回減少しました)。署名なしとして扱われると、可能な限り最大の整数になるため、比較は真実です。それは長い間真実であるため、ループは決して終わらないように見えます。最終的に増加します A
および減少 B
彼らはお互いを通過させ、ループは終了しますが、予想以上に時間がかかります
署名されていないINTを負の数と比較しています。 Aを署名付きINTに変えてみてください。
署名されたものと署名されていないことを比較すると、紛らわしい動作につながる可能性があります。両方を作る必要があります A
と B
同じタイプ。
署名されていない署名を比較しています。しかし、最終的には「こんにちは」が表示されます。 aとbは両方ともオーバーフローしてb> a falseを作成します。