質問

他の人のコードを読むときに、非常に奇妙な for ループが見られました。 C for ループの完全な構文の説明を検索しようとしましたが、単語" for &quot ;無関係な文に表示されるため、Googleで効果的に検索することはほとんど不可能です。

この質問はこのスレッドを読んだ後に思い浮かびました。 >

for はこちら:

for(p=0;p+=(a&1)*b,a!=1;a>>=1,b<<=1);

中間条件では、2つのコードを区切るコンマがありますが、このコンマは何をしますか?右側のカンマは、 a&gt;&gt; = 1 b&lt;&lt; = 1 の両方を作成することを理解しています。

しかし、ループの終了条件内で、どうなりますか? p == 0 a == 1 、または両方が発生したときに終了しますか?

誰かがこれを理解するのを手伝ってくれて、多分 for ループ構文の説明の方向を教えてくれるといいですね。

役に立ちましたか?

解決

コンマはforループを除外しません。カンマ演算子です。

x = (a, b);

最初にa、次にbを実行し、次にxをbの値に設定します。

for構文は次のとおりです。

for (init; condition; increment)
    ...

これはやや(今のところ continue break を無視して)次と同等です:

init;
while (condition) {
    ...
    increment;
}

だからあなたのforループの例は( continue break を無視して)

と同等です
p=0;
while (p+=(a&1)*b,a!=1) {
    ...
    a>>=1,b<<=1;
}

どのように動作するか( continue および break を無視します):

p=0; 
while (true) {
    p+=(a&1)*b;
    if (a == 1) break;
    ...
    a>>=1;
    b<<=1;
}

上記のwhileループへの簡易変換ではなかったforループの2つの追加詳細:

  • 条件を省略すると、常に true になります( break goto 、または他の何かが中断しない限り、無限ループになります)ループ)。
  • continue は、インクリメントをスキップするwhileループの continue とは異なり、インクリメントの直前のラベルへのgotoのように動作します。

また、コンマ演算子に関する重要な詳細:&amp;&amp; || などのシーケンスポイントです(これを分割できる理由です)ステートメントを分離し、その意味をそのまま保持します)。


C99の変更

C99標準では、この説明の前半で言及されていないニュアンスがいくつか導入されています(C89 / C90に非常に適しています)。

最初に、すべてのループはそれ自体がブロックです。事実上、

for (...) { ... }

それ自体は一対のブレースに包まれています

{
for (...) { ... }
}

標準のsayeth:

  

ISO / IEC 9899:1999&#167; 6.8.5反復ステートメント

     

&#182; 5反復ステートメントは、そのスコープがそのスコープの厳密なサブセットであるブロックです   囲みブロック。ループ本体も、スコープがスコープの厳密なサブセットであるブロックです   反復ステートメントの。

これは、追加のブレースのセットの観点からも理論的根拠に記載されています。

第二に、C99の init 部分は、

のように(単一の)宣言にすることができます
for (int i = 0; i < sizeof(something); i++) { ... }

「ループにラップされたブロック」は独自のものになりました。変数 i がループ外でアクセスできない理由を説明しています。複数の変数を宣言できますが、すべて同じ型である必要があります。

for (int i = 0, j = sizeof(something); i < j; i++, j--) { ... }

標準のsayeth:

  

ISO / IEC 9899:1999&#167; 6.8.5.3 forステートメント

     

ステートメント

for ( clause-1 ; expression-2 ; expression-3 ) statement
     

は次のように動作します。式expression-2は、制御式です。   ループ本体の各実行前に評価されます。式expression-3は   ループ本体が実行されるたびにvoid式として評価されます。句-1が   宣言、それが宣言する変数のスコープは、宣言の残りであり、   他の2つの式を含むループ全体。実行順に到達します   制御式の最初の評価の前。 Clause-1が式の場合、   制御式の最初の評価の前にvoid式として評価されます。 133)

     

clause-1とexpression-3は両方とも省略できます。省略された式-2は、   ゼロ以外の定数。

     

133)したがって、clause-1はループの初期化を指定し、場合によっては1つ以上の変数を宣言して使用します   ループ;制御式expression-2は、各反復の前に行われる評価を指定します。   式が0に等しくなるまでループの実行が継続するように。および式-3   各反復後に実行される操作(増分など)を指定します。

他のヒント

カンマは2つの式を単に区切るだけで、通常の式が許可されるCのどこでも有効です。これらは左から右の順に実行されます。右端の式の値は、式全体の値です。

for ループは3つの部分で構成されていますが、いずれも空の場合もあります。各反復の最初に1つ(最初)が実行され、最後に1つ(3番目)が実行されます。これらの部分は通常、それぞれカウンターを初期化および増分します。しかし、彼らは何でもするかもしれません。

2番目の部分は、各実行の開始時に実行されるテストです。テストの結果が false の場合、ループは中止されます。これですべてです。

Cスタイルのループは3つの式で構成されています:

for (initializer; condition; counter) statement_or_statement_block;
  • イニシャライザは、ループが開始されたときに1回実行されます。
  • 条件は各反復の前にチェックされます。ループは、trueと評価される限り実行されます。
  • カウンタは各反復後に1回実行されます。

これらの各部分は、ループを作成する言語で有効な式にすることができます。つまり、より創造的に使用できます。事前にしたいことはすべてイニシャライザーに行くことができ、その間にやりたいことは条件またはカウンターに行くことができます。ループがもはや本体を持たなくなるまでです。

これを実現するには、コンマ演算子が非常に便利です。式を連結して、1つの新しい式を形成できます。ほとんどの場合、forループでそのように使用されますが、カンマ演算子のその他の意味(値の割り当てに関する考慮事項など)は小さな役割を果たします。

構文を創造的に使用することで巧妙なことを行うことができますが、それを行うための本当に正当な理由が見つかるまで、私はそれを避けます。 forループでコードゴルフをプレイすると、コードの読み取りと理解(および保守)が難しくなります。

ウィキペディアには、 forループに関する記事もあります。

for ループのすべてはオプションです。複数の変数を初期化する、複数の条件を確認する、コンマ演算子を使用して複数の変数を繰り返すことができます。

次の for ループは、無限ループに入ります。状態を確認して注意してください。

for(;;) 

コンラッドは、繰り返したい重要なポイントに言及しました:右端の式の値は、式全体の値です。

&quot;条件&quot;に2つのテストを入れると、Gnuコンパイラーがこの警告を述べましたforループのセクション

warning: left-hand operand of comma expression has no effect

&quot; condition&quot;で本当に意図したこと&quot;&amp;&amp;&quot;を使用した2つのテストでした。の間に。 Konradの声明によると、コンマの右側のテストのみが条件に影響します。

forループは特定の時間for(;;)の実行です

forループの構文

for(;;)

または

for(初期化子;条件;カウンター)

e.g(rmv = 1; rmv&lt; = 15; rmv ++)

ブロックの15回までの実行

1。値を開始するため、最初に値を初期化します

(e.g)rmv = 1またはrmv = 2

2.secondステートメントは、条件がtrueまたはfalseであるかどうかをテストします。

e.g i = 5; i&lt; = 10条件は真です

i=10;i<10 the condition is false terminate for block,

3.thirdはインクリメントまたはデクリメント

(e.g)rmv ++または++ rmv

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top