私は次のコードを見つけました:
int func_prim (int zahl) {
int count;
if (zahl < 0)
return -1;
for (count = 2; zahl % count != 0 && zahl >= count; count++);
if (count == zahl)
return 1;
return 0;
}
機能のポイントは、数が素数かどうかをチェックすることです。
For-loopの最後に;
がある理由がわかりません。
v
for (count = 2; zahl % count != 0 && zahl >= count; count++);
それなしでは、コードは適切に動作しません。
説明は何ですか?
次とまったく同じ意味です。
for(count = 2; zahl % count != 0 && zahl >= count; count++)
{
}
Forループにはfor
キーワードがあり、その後にセミコロンで区切られた3つのオプション式を含む括弧があり、その後にループの各反復で実行される本体が続きます。
この例のforループの目標は、count
の値を設定することです。これは、後続のifステートメントでzahl
と比較されます。これはセミコロンで区切られた式で実現されるため、ループ本体は何もする必要がありません。
ループは何もする必要がないため、空のステートメントを本体として使用します。
末尾の;
が省略され、他の変更が行われなかった場合、forループの後のifステートメント自体がforループの本体になります。 (これは意図したものではなく、あなたが観察したようにプログラムを壊してしまうでしょう。)
ただし、同じ行の単一の;
でループ本体を構成することは、空のループ本体を記述する唯一の方法ではなく、おそらく最も賢明な方法でもありません。それは完璧に機能しますが、問題は、他の読者、そしておそらく同じプログラマーが、後でプロジェクトに戻って、それが実際にエラーであるかどうか疑問に思うかもしれないということです。結局のところ、Cスタイル言語でコーディングする場合、行末にセミコロンを入力することが非常に多いため、所属していない場所に余分なセミコロンを入力するのは簡単です。
もう1つの問題は、;
を本文とする1行のループが選択されたスタイルであるコードでは、実際に誰かがrecognizeするのが難しいことです。has所属していないときに;
を置くというミスを犯しました。
したがって、次の選択肢が望ましい場合があります。
;
を次の行に置く- sh1が示唆するように{ }
として記述するcontinue;
ステートメントにします。これにより、単純にループが次の反復に移動します(ループ本体が空のときと同じです)- sh1が示唆するとおりForループの最後にあるセミコロンは、本文がないことを意味します。このセミコロンがないと、Cはif
ステートメントがforループの本体であると見なします。
for
loop(iteration statement)の構文は
for ( clause-1 ; expression-2 ; expression-3 ) statement
statement
には、nullステートメント(;
)を使用できます。 C11 6.8.3によると
Nullステートメント(セミコロンのみで構成される)は、操作を実行しません。
パラ5では、例を示します
プログラムフラグメント内
char *s; /* ... */ while (*s++ != '\0') ;
繰り返しステートメントに空のループ本体を提供するためにnullステートメントが使用されます。
同じことが起こっています
for (count = 2; zahl % count != 0 && zahl >= count; count++);
;
は、for
ステートメントに空のループ本体を提供するために使用されます。 ;
がなければ、for
ループの隣のステートメントが本体と見なされ、実行されます。
他の優れた答えがすでに言っていることに加えて、私はそれを指摘したいと思います
for(count=2; zahl % count != 0 && zahl >= count; count++);
(つまり、「カウンター」をインクリメントするために使用される空のステートメントを持つfor
ループ)は次と同等です。
count=2;
while(zahl % count != 0 && zahl >= count)
{
count++;
}
これにより、コードの目的がリストされた代替案のいくつかよりもさらに明確になります。コメントが存在しない場合、提示された場合のように、空のステートメントを含むループは、コードを保持または使用する必要がある別のプログラマーを混乱させる可能性がありますOPの場合はこちら)。
コンテキストはステートメントの真のスコープを識別するのに役立つかもしれませんが、空のステートメントを含むfor
ループとステートメントを含むwhile
ループの間では、後者はそのスコープを理解するのに必要な作業が少なくなります。
For文はループ文で、その構造により変数の初期化、式のテスト、変数の変更が簡単になります。カウンター制御ループを作成するのに非常に便利です。 forステートメントの一般的な形式は次のとおりです。
for (initialize; test; step) statement
[...]
nullステートメントは、セミコロンのみです。
;
Nullステートメントは何もしません。値をどこにも保存しません。プログラムの実行中に時間が経過することはありません。
ほとんどの場合、nullステートメントはループステートメントの本体として、またはforステートメントの1つ以上の式として使用されます。以下は、ループの本体としてnullステートメントを使用するforステートメントの例です(そして、楽しみのためにnの整数平方根も計算します):
for (i = 1; i*i < n; i++) ;
次に、forステートメントの本体としてnullステートメントを使用し、出力を生成する別の例を示します。
for (x = 1; x <= 5; printf ("x is now %d\n", x), x++) ;
Nullステートメントは、ブロック内の最後のラベルとなるラベルの後に使用されることもあります。
あなたの場合、;
は、 for
ステートメント の Nullステートメント です。
int func_prim (int zahl) {
int count;
if (zahl < 0)
return -1;
for (count = 2; zahl % count != 0 && zahl >= count; count++)
;
if (count == zahl)
return 1;
return 0;
}
これがないと、if
がforステートメントになります。
int func_prim (int zahl) {
int count;
if (zahl < 0)
return -1;
for (count = 2; zahl % count != 0 && zahl >= count; count++)
if (count == zahl)
return 1;
return 0;
}
したがって、異なる動作をします。
;
for
ループの後は、単にfor
ループがカウンターcount
を増やすこと以外は何もしないことを意味します。
Forループは、count
の値を増やすためだけにあります。
for
ループは(通常)ボディを持ちます。
本体が中括弧で囲まれている{
}
ただし、単一のステートメント本体の場合、中括弧はオプションです。
;
は空のステートメントです。
上記を組み合わせると、条件がfor
になるまでfalse
ループが実行されることが明らかになります。