C言語
次のコードがエラーなしでコンパイルされる C 標準 (C89、C99、C11)
for (int i = 0; i < 10; ++i) {
DO SOMETHING...
}
一部の C コンパイラは上記のバージョンを受け入れず、変数 "i" は括弧の外側で宣言する必要があることを理解しています。そのようです:
int i;
for (i = 0; i < 10; ++i) {
DO SOMETHING...
}
C言語
次のコードがエラーなしでコンパイルされる C 標準 (C89、C99、C11)
for (int i = 0; i < 10; ++i) {
DO SOMETHING...
}
一部の C コンパイラは上記のバージョンを受け入れず、変数 "i" は括弧の外側で宣言する必要があることを理解しています。そのようです:
int i;
for (i = 0; i < 10; ++i) {
DO SOMETHING...
}
これは c99 以降で許可されています。したがって、c99 と c11 はそれをサポートしています。
c89 では、for
ステートメントの最初の句は式のみにすることができます。c99 および c11 では、式または宣言にすることができます。1 つの宣言のみが許可されます (ただし、複数の変数を宣言できます)。
C99 で初めて導入されました。C99 Rational V5.10 §6.8.5.3からの引用 for ステートメント
C99 の新機能: for ループには、ループの開始時に初期化され、ループ後に再び使用されることのない 1 つ以上のカウンター変数が含まれるのが一般的です。C89 では、囲んでいるブロックの先頭でこれらの変数を宣言する必要があり、後で誤ってそれらを他の目的で再利用するリスクがありました。これらの変数を for ステートメント自体の一部として宣言できるようになりました。このようなループ変数は新しいスコープにあるため、同じ名前の他の変数には影響せず、ループの最後で破棄され、最適化の可能性があります。
構文を単純化するために、各ループは 1 つの宣言に制限され (ただし、複数の変数を宣言できます)、これらには auto または registerstorage クラスが必要です。
例:
int i = 42; 15
for (int i = 5, j = 15; i < 10; i++, j--)
printf("Loop %d %d\n", i, j);
printf("I = %d\n", i); // there is no j in scope
出力します:
Loop 5 15 20
Loop 6 14
Loop 7 13
Loop 8 12
Loop 9 11
I = 42 25
この構文では、次のようなループが許可されていることに注意してください。
for (struct s *p = list, **q; p != NULL; p = *q)
q = &(p->next);
C99 は、このサポートが最初に標準の一部になったときです。
基本的に、for
ステートメントは追加の暗黙のブロックを導入しました。他のすべてのブロック スコープ ルールは同じままです。
ループの周りに追加のブロック スコープを導入することで、C99 以前の実装で同じことをシミュレートできfor
ます。
{
int i;
for (i = 0; i < 10; ++i)
{ ... }
}
{
int i; // i here is not the same as i up there
}