1

これはC
のコード行です。ここでのループの条件は++iです。
では、ここでは他の2つが条件として表示されるため、コンパイラはどの条件を考慮するかをどのように決定するのでしょうか。

char i=0;
for(i<=5&&i>-1;++i;i>0)
    printf("%d",i);

出力

1234..127-128-127....-2-1
4

3 に答える 3

3

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
}

ご覧のとおり、とでマークされた行XZ完全に役に立たない。したがって:

char i = 0;
while (++i)
    printf("%d", i);

これは、結果++iがゼロの場合は常に1から印刷されることを意味します。

charコンパイラーで署名されている場合、動作は実装に任されますが、負の値にオーバーフローしてゼロまで動作する可能性があります。

が正の場合char、オーバーフローして0に戻るまで正の値を出力します。

于 2012-07-27T15:50:15.547 に答える
0

ここでのループ終了条件は++iです。それについては謎はありません。ループは、0に達すると停止します(「false」になるため)

于 2012-07-27T15:54:33.640 に答える
0

そうではありません。最初の部分を実行し、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になります。

于 2012-07-27T15:49:54.870 に答える