web-dev-qa-db-ja.com

「;」の目的は何ですか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-loopの最後に;がある理由がわかりません。

                                                            v
for (count = 2; zahl % count != 0 && zahl >= count; count++);

それなしでは、コードは適切に動作しません。

説明は何ですか?

77
Wien95

次とまったく同じ意味です。

for(count = 2; zahl % count != 0 && zahl >= count; count++)
{
}
87
M.M

Forループにはforキーワードがあり、その後にセミコロンで区切られた3つのオプション式を含む括弧があり、その後にループの各反復で実行される本体が続きます。

この例のforループの目標は、countの値を設定することです。これは、後続のifステートメントでzahlと比較されます。これはセミコロンで区切られた式で実現されるため、ループ本体は何もする必要がありません。

ループは何もする必要がないため、空のステートメントを本体として使用します。

末尾の;が省略され、他の変更が行われなかった場合、forループの後のifステートメント自体がforループの本体になります。 (これは意図したものではなく、あなたが観察したようにプログラムを壊してしまうでしょう。)

ただし、同じ行の単一の;でループ本体を構成することは、空のループ本体を記述する唯一の方法ではなく、おそらく最も賢明な方法でもありません。それは完璧に機能しますが、問題は、他の読者、そしておそらく同じプログラマーが、後でプロジェクトに戻って、それが実際にエラーであるかどうか疑問に思うかもしれないということです。結局のところ、Cスタイル言語でコーディングする場合、行末にセミコロンを入力することが非常に多いため、所属していない場所に余分なセミコロンを入力するのは簡単です。

もう1つの問題は、;を本文とする1行のループが選択されたスタイルであるコードでは、実際に誰かがrecognizeするのが難しいことです。has所属していないときに;を置くというミスを犯しました。

したがって、次の選択肢が望ましい場合があります。

  • インデントされた;を次の行に置く- sh1が示唆するように
  • ループ本体を空のステートメントではなく、空のブロック{ }として記述する
  • ループ本体をcontinue;ステートメントにします。これにより、単純にループが次の反復に移動します(ループ本体が空のときと同じです)- sh1が示唆するとおり
54
Eliah Kagan

Forループの最後にあるセミコロンは、本文がないことを意味します。このセミコロンがないと、Cはifステートメントがforループの本体であると見なします。

42
Rohn Adams

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ループの隣のステートメントが本体と見なされ、実行されます。

23
haccks

他の優れた答えがすでに言っていることに加えて、私はそれを指摘したいと思います

for(count=2; zahl % count != 0 && zahl >= count; count++);

(つまり、「カウンター」をインクリメントするために使用される空のステートメントを持つforループ)は次と同等です。

count=2;
while(zahl % count != 0  && zahl >= count)
{
    count++;
}

これにより、コードの目的がリストされた代替案のいくつかよりもさらに明確になります。コメントが存在しない場合、提示された場合のように、空のステートメントを含むループは、コードを保持または使用する必要がある別のプログラマーを混乱させる可能性がありますOPの場合はこちら)。

コンテキストはステートメントの真のスコープを識別するのに役立つかもしれませんが、空のステートメントを含むforループとステートメントを含むwhileループの間では、後者はそのスコープを理解するのに必要な作業が少なくなります。

18
Federico

forステートメント

For文はループ文で、その構造により変数の初期化、式のテスト、変数の変更が簡単になります。カウンター制御ループを作成するのに非常に便利です。 forステートメントの一般的な形式は次のとおりです。

 for (initialize; test; step)
   statement

[...]

Nullステートメント

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;
}

したがって、異なる動作をします。

13
falsarella

;forループの後は、単にforループがカウンターcountを増やすこと以外は何もしないことを意味します。

13
user4826588

Forループは、countの値を増やすためだけにあります。

11
bmpasini

forループは(通常)ボディを持ちます。

本体が中括弧で囲まれている{}

ただし、単一のステートメント本体の場合、中括弧はオプションです。

;は空のステートメントです。

上記を組み合わせると、条件forになるまでfalseループが実行されることが明らかになります。

10
user3629249