0

以下の c プログラムの出力は、 output : 1,2,3,4 ........ 126,127,-128,-127 .... -2,-1 ? です。

#include <stdio.h>
#include <string.h>

int main()
{
   char i=0;
   for(i<=5 && i>=-1 ; ++i;i>0)
     printf("%d\n",i);
   printf("\n");
   return 0;

}

なぜそうなのか説明してください。

4

5 に答える 5

0

コードの内訳は次のとおりです。かなり卑劣です。

for( i <= 5 && i >= -1 ; ++i; i > 0)

通常、for ループは ( 最初のステートメント、式、2 番目のステートメント) です。最初の null ステートメントの前のコードを見ると、(ステートメントの代わりに) 式が作成されていますが、これはまったく問題ではありませんが、まったく役に立ちません。したがって、その行を削除すると (この式の結果には影響しません)、次のようになります。

for( ; ++i; i > 0)

i... for ループの前に 0 に初期化したことに気付いた場合。次に行うことは、インクリメントiしてからその値を返すことです (こちらを参照)。したがって、1 ... -1 (127 でオーバーフロー) になります。これは、C ではゼロ以外の値が でtrueあり、0 が であるためですfalse。したがって、一度i0 になると、ループの実行が停止します。iオーバーフローによってのみゼロになることができます。

あなたの 3 番目のステートメントは重要ではなく、無関係です。

于 2013-08-13T11:47:51.247 に答える
0

オーバーフローといいます。タイプ「char」は RAM の容量の 1 バイトを使用するため、256 個の値しか保存できません。これらは [-128, 127] です。127 を超えようとすると、最も低い値に戻ります。

それ以外は、 for ループが少しめちゃくちゃです。試す

for ( i = 0 ; i <= 5 ; ++i ) // This will print 0,1,2,3,4,5
    printf( "%d\n" , i );
于 2013-08-13T11:43:26.400 に答える
0

for ループの使い方が間違っていると思います。

for(i<=5 && i>=-1 ; ++i;i>0)

上記のコードは次のことを意味します。

  1. 何よりもまず、評価しi<=5 && i>=-1ます (これには副作用がないため、何も起こりません)。
  2. 繰り返しごとに、インクリメントiしてゼロかどうかを確認します。ゼロでない場合は、別の反復を実行します。
  3. すべての反復の終わりに、評価しますi>0(これも何もしません)。

したがって、ループは単純化され、本質的に

while (++i)

結果を説明するために、使用しているシステムは、127 より大きい場合に負の数に「ラップ」する符号付きの 2 の補数整数として char を実装している可能性があります(8 ビットの 2 の補数整数の 128 は - 128)

于 2013-08-13T11:44:41.047 に答える
0

まず、char は 1 バイトを占有し、署名されています。8 ビット (1 バイト) の助けを借りて、表現できる数値の範囲は次のとおりです。

**-(2^(8-1)) to +((2^(8-1)) -1) [ie from -128 to +127].**

あなたのコードでは、 i をインクリメントし、同じものを印刷しています。i が 127 (2 進数で 0111 1111 = 127) に達すると、再びインクリメントすると (1000 0000)、つまり -128 になります。

印刷中に %d を使用しています。out は整数形式になります。そのため、1,2,3 ... -128、-127 ... を出力しています。

1000 0000 が -128 であることを理解していない場合は、以下をお読みください。

2の補数とは何ですか?

于 2013-08-13T11:44:56.540 に答える
0

これのため:

for(i<=5 && i>=-1 ; ++i;i>0)

として働く

1) 初期化:

   i<=5 && i>=-1

何もしません

2) 終了条件:

   ++i

i をインクリメントし、i がゼロになると終了します

3) ループのたびに実行されるステートメント (通常はインクリメント/デクリメント):

   i > 0

何もしません。

したがって、コードは i = 0 から再びゼロになるまでループします

于 2013-08-13T11:44:14.637 に答える