コンマは 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
、または他の何かがループを壊します)。 - A
continue
continue
とは異なり、インクリメントの直前のラベルへの goto であるかのように動作します。 インクリメントをスキップする while ループ内。
また、コンマ演算子に関する重要な詳細:これは &&
のようなシーケンス ポイントです。 および ||
(これが、別のステートメントに分割して、その意味をそのまま維持できる理由です)。
C99 の変更
C99 標準には、この説明で前述されていないいくつかのニュアンスが導入されています (これは C89/C90 に非常に適しています)。
まず、すべてのループはそれ自体がブロックです。事実上、
for (...) { ... }
それ自体が 1 対の中括弧で囲まれています
{
for (...) { ... }
}
標準的な言い方:
これは、追加の中括弧のセットに関して、根拠にも説明されています。
次に、init
C99 の部分は、次のように (単一の) 宣言にすることができます
for (int i = 0; i < sizeof(something); i++) { ... }
これで、「ループにラップされたブロック」が本領を発揮します。変数 i
の理由を説明しています ループの外ではアクセスできません。複数の変数を宣言できますが、それらはすべて同じ型でなければなりません:
for (int i = 0, j = sizeof(something); i < j; i++, j--) { ... }
標準的な言い方:
コンマは単に 2 つの式を区切るだけで、通常の式が許可されている C のどこでも有効です。これらは左から順に実行されます。一番右の式の値が式全体の値です。
for
ループは 3 つの部分で構成され、そのいずれも空である場合があります。 1 つ (1 つ目) は最初に実行され、もう 1 つ (3 つ目) は各反復の最後に実行されます。これらの部分は通常、それぞれカウンターを初期化し、インクリメントします。しかし、彼らは何でもするかもしれません.
2 番目の部分は テスト です これは、各実行の開始時に実行されます。テストの結果が false
の場合 、ループは中止されます。それだけです。
C スタイルの for ループは、次の 3 つの式で構成されます:
for (initializer; condition; counter) statement_or_statement_block;
- ループの開始時にイニシャライザが 1 回実行されます。
- 各反復の前に条件がチェックされます。ループは true と評価される限り実行されます。
- 反復ごとにカウンターが 1 回実行されます。
これらの各部分は、ループを記述する言語で有効な式にすることができます。つまり、より創造的に使用できるということです。ループの本体がなくなるまで、前に実行したいことはすべて初期化子に入れることができ、その間に実行したいことはすべて条件またはカウンターに入れることができます。
これを実現するには、コンマ演算子が非常に便利です。式を連鎖させて、単一の新しい式を形成することができます。ほとんどの場合、for ループでそのように使用されますが、カンマ演算子のその他の意味 (値の割り当てに関する考慮事項など) は重要ではありません。
構文を創造的に使用することで巧妙なことを行うことはできますが、本当に そうする正当な理由。 for ループでコード ゴルフをプレイすると、コードの読み取りと理解 (および保守) が難しくなります。
ウィキペディアにも for ループに関する素晴らしい記事があります。