次の for ループは何をしますか? プログラムがループから抜け出すのはいつですか?
for (c = 0; n; c++) {
/* . . . */
}
SO に関するこの回答の for ループの例を次に示します。
次の for ループは何をしますか? プログラムがループから抜け出すのはいつですか?
for (c = 0; n; c++) {
/* . . . */
}
SO に関するこの回答の for ループの例を次に示します。
nになるとループが中断されます0(つまり、ループは にnなるまで停止しません0)。これは、ループ内で発生する可能性があり (ループ本体が 最終的に設定nされる0)、または何らかの外部イベントが原因で発生する可能性があります。外部イベントの例としては、共有メモリの更新、またはシグナル ハンドラによる変更があります。変数は、cループによってループ本体に入る回数だけインクリメントされforます。c変数は に初期化されます0。
技術的には、コード フラグメントはループではなく、ループ ステートメントその後、質問のタイトルと投稿が変更されました。forの制御構造にすぎません。forフラグメントにループ本体がありません。forでも、質問のタイトルは「this -loop structure」に関するものなので、大丈夫です。
別の回答で関数にリンクしていますが、その関数の目的は、数値に設定されたビット数をカウントすることであることをすでに理解しているようです。
編集:この回答は、エラーで指定されたリンクされた質問のビット単位の操作の説明です。それはまだ最後に終了を説明しています。
リンクされたコードは次のとおりです。
long count_bits(long n) {
unsigned int c; // c accumulates the total bits set in v
for (c = 0; n; c++)
n &= n - 1; // clear the least significant bit set
return c;
}
ここで興味深い行はn &= n - 1;. これは に設定nされますn & (n - 1)。ここ&で、 はビットごとの AND 演算子です。この例では、最下位ビットをクリアする、つまり最下位ユニット ビットを 0 に設定すると述べています。
この例を想像してみてください。たとえば、次のような番号があります。
01010100
デクリメントすると (テイク 1)、次のようになります。
01010011
***
デクリメントするたびに、最下位ビットが削除され、その下のビットが 1 になります。これが減算のしくみです。10 進数では 1000 - 1 = 999 に相当しますが、10 桁ではなく 2 桁です。
今、私たちが一緒にいるとき:
01010100
&01010011
=01010000
***
ビットごとの & は、入力された両方のビットが 1 の場合にのみビットを 1 に設定します。
ご覧のとおり、減算後に最下位ビットが 0 になり、その下のビットが減算前に 0 になるため、演算では常に最下位セット ビットが削除されます。これらのビットはすべて & 演算で両方の数字が 1 にならないため、0 に評価されます。 . 他のすべての設定ビットは変更されないため、操作のために 2 つの 1 を指定し、それらの値を保持します。
nconditionが false のとき、つまりnisのとき0(すべてのビットが削除されたとき、 value )、ループは終了します00000000。したがって、これは各ビットが削除された後でありc、 にあったビット数の値を残しますn。
C では、ブール値は、数値形式がゼロ以外の場合は「真」と見なされ、数値がゼロの場合は「偽」と見なされることに注意してください。
forC 標準では、節の「中間のもの」は式であると規定されています。その式が非ゼロと評価される限り、ループは継続されます。したがってn、一度ループを終了させる式nはゼロです。より明示的な形式は次のようになります
for (c = 0; n != 0; c++)
まともなコンパイラは同じコードにコンパイルされます。
実際、C 標準では、特殊なケースとして「中間のもの」を空にすることが許可されており、その場合はtrueと見なされます。これが、無限ループを次のように書ける理由です。
for (;;) { ... }
地獄の忌まわしき醜さの代わりにwhile(1)。
簡単に言えば同等ですfor( c = 0; n != 0; c++)