2 番目のスコープは { } 中括弧内のみであるため、C++ コンパイラはこれを有効なものとして受け入れます。C で同じものを実装すると、次のようなエラーが表示されます。
$ gcc test.c
test.c: In function ‘main’:
test.c:10: error: ‘for’ loop initial declaration used outside C99 mode
test.c:12: error: ‘for’ loop initial declaration used outside C99 mode
これは、ほとんどの C 方言では違法です。これは正当な C++ 宣言であるため、C++ コンパイラで C をコンパイルしている場合は受け入れられる可能性があります。
for( int i=0; i<5; ++i){}
C++ ではループのスコープ内にのみループ イテレータを配置するのが一般的ですが、C では (特に C99 ではなく C90 を使用して) 宣言がループのスコープ外にあることを確認します。それが役立つことを願っています... :-)
そのため、古いループ内で別の FOR ループを宣言すると、スコープが新たに開始され、コードは C++ または C99 でエラーなしでコンパイルされます。これは、スコープ宣言の通常受け入れられている基準です。