このコードのチャンクは、Cプログラミング-現代的なアプローチという名前の本からの演習にあります。
for(i=10;i>=1;i/=2)
{
printf("%d", i++);
}
編集:
最初の出力は10で、ループの次のステップで1ずつ増えるはずですが、このコードを実行すると、取得するのは1だけで、1の出力が停止することはありません。
このコードを理解するのを手伝ってください。
このコードのチャンクは、Cプログラミング-現代的なアプローチという名前の本からの演習にあります。
for(i=10;i>=1;i/=2)
{
printf("%d", i++);
}
編集:
最初の出力は10で、ループの次のステップで1ずつ増えるはずですが、このコードを実行すると、取得するのは1だけで、1の出力が停止することはありません。
このコードを理解するのを手伝ってください。
このコードは言う
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]が真でなくなるまで繰り返されます
コードの使用量は少なくなります。2で割って1になると、ステートメントirで値が再びインクリメントされるため、出力は10 5 3 2 1 1 1 1 . . .
無限に生成されます。そして2になります。1
i
printf
i++
したがって、コードは無限ループになります。
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が永久に印刷されるのがわかりますが、その理由がわかると思います。
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になり、それからたくさんの出力が得られますか?