-2

このコードのチャンクは、Cプログラミング-現代的なアプローチという名前の本からの演習にあります。

for(i=10;i>=1;i/=2)
{
    printf("%d", i++);
}

編集:

最初の出力は10で、ループの次のステップで1ずつ増えるはずですが、このコードを実行すると、取得するのは1だけで、1の出力が停止することはありません。

このコードを理解するのを手伝ってください。

4

4 に答える 4

7

このコードは言う

for( start with 10 ; as long as it is greater or equals 1 ; divide i by 2){
    Print i;
    add 1 to i
}

それで:

start with 10:
print 10;
10 + 1 = 11
11 / 2 = 5,5 = 5 because it's int
print 5
5 + 1 = 6
6 / 2 = 3
print 3
3 + 1 = 4
4 / 2 = 2
print 2
2 + 1 = 3
3 / 2 = 1
print 1
1 + 1 = 2
2 / 2 = 1
print 1
1 + 1 = 2
2 / 2 = 1
.... and it will continue forever and ever

forループの実行順序:

for([init];[1];[3]){
    [2]
}

もちろん、[1]、[2]、[3]の順序は、[1]が真でなくなるまで繰り返されます

于 2012-08-30T13:43:40.317 に答える
1

コードの使用量は少なくなります。2で割って1になると、ステートメントirで値が再びインクリメントされるため、出力は10 5 3 2 1 1 1 1 . . .無限に生成されます。そして2になります。1iprintfi++

したがって、コードは無限ループになります。

于 2012-08-30T13:52:06.647 に答える
0

iは10から始まり、i>または= 1である限り実行され、各反復iは半分(i / 2)ずつ減少します。

印刷はiの値を印刷し、それを1つインクリメントします。それで

Iteration 1:
  10  (i+1 = 11)
Iteration 2:
  5   (i/2 = 5 + 1 = 6)
Iteration 3:
  3   (i/2 = 3 + 1 = 4)
Iteration 4:
  2   (i/2 = 2 + 1 = 3)
Iteration 5:
  1   (i/2 = 1 + 1 = 2)
...
Iteration N:
  1   (i/2 = 1 + 1 = 2)

その後のすべての反復は1になります。そのため、1が永久に印刷されるのがわかりますが、その理由がわかると思います。

于 2012-08-30T13:47:14.930 に答える
0

i=1出力が1から始まる場合、ループ内のテスト条件はではなく、として書き込まれi>=1ます。テスト条件を修正すると、ループが正しく実行されることがわかります。

そういえば、それは次のようi=10になります。ループの開始時のように、それが出力になります。次に、11にi++増分iし、printステートメントで使用を投稿します。

コードがループの最後に到達すると、ループステップ調整(i/=2)が実行されます。これは、11 \2=新しいi値を意味します。これは5になります。次に、コードはの新しい値をテストしi、ループを再度実行し、。までこれらの手順を繰り返しますi < 1

i= 1ステップの場合と同様に、1+1=2および2/2=1になります。ループが開始されると、ループが停止することはありません(テストi>=1は常に真になるため)。出力が1から始まるのは確かですか、それともすぐに10から1になり、それからたくさんの出力が得られますか?

于 2012-08-30T13:50:56.390 に答える