1

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...

}
4

3 に答える 3

8

これは c99 以降で許可されています。したがって、c99 と c11 はそれをサポートしています。

c89 では、forステートメントの最初の句は式のみにすることができます。c99 および c11 では、式または宣言にすることができます。1 つの宣言のみが許可されます (ただし、複数の変数を宣言できます)。

于 2013-07-07T09:29:22.047 に答える
7

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);
于 2013-07-07T09:39:39.823 に答える
4

C99 は、このサポートが最初に標準の一部になったときです。

基本的に、forステートメントは追加の暗黙のブロックを導入しました。他のすべてのブロック スコープ ルールは同じままです。

ループの周りに追加のブロック スコープを導入することで、C99 以前の実装で同じことをシミュレートできforます。

{
    int i;
    for (i = 0; i < 10; ++i)
    { ... }
}
{
    int i;  // i here is not the same as i up there
}
于 2013-07-07T09:30:42.670 に答える