これはC
のコード行です。ここでのループの条件は++iです。
では、ここでは他の2つが条件として表示されるため、コンパイラはどの条件を考慮するかをどのように決定するのでしょうか。
char i=0;
for(i<=5&&i>-1;++i;i>0)
printf("%d",i);
出力
1234..127-128-127....-2-1
これはC
のコード行です。ここでのループの条件は++iです。
では、ここでは他の2つが条件として表示されるため、コンパイラはどの条件を考慮するかをどのように決定するのでしょうか。
char i=0;
for(i<=5&&i>-1;++i;i>0)
printf("%d",i);
出力
1234..127-128-127....-2-1
for
ステートメントは次のように機能します。
for (X; Y; Z)
{
...
}
に変換されます
X;
while (Y)
{
...
Z;
}
したがって、コードは次のように変更されます。
char i=0;
for(i<=5&&i>-1;++i;i>0)
printf("%d",i);
に:
char i = 0;
i<=5 && i>-1; // X
while (++i) // Y
{
printf("%d", i);
i > 0; // Z
}
ご覧のとおり、とでマークされた行X
はZ
完全に役に立たない。したがって:
char i = 0;
while (++i)
printf("%d", i);
これは、結果++i
がゼロの場合は常に1から印刷されることを意味します。
char
コンパイラーで署名されている場合、動作は実装に任されますが、負の値にオーバーフローしてゼロまで動作する可能性があります。
が正の場合char
、オーバーフローして0に戻るまで正の値を出力します。
ここでのループ終了条件は++iです。それについては謎はありません。ループは、0に達すると停止します(「false」になるため)
そうではありません。最初の部分を実行し、i
これの副作用に設定されます。次に、2番目の部分がfalseの場合、この場合i
は0の場合に終了し、すべてのループで3番目の部分を実行します。
したがって、コンパイラは基本的にこれを次のように書き直します。
char i=0;
i<=5&&i>-1;
do {
printf("%d",i);
i>0;
} while ( (++i) != 0)
ヒント:charは署名されており、2の補数であるため、1,2,3 .... 128、-127、-126....0になります。