GNU89,混合声明和循环初始声明

GCC和ICC的默认C语言是GNU89。 GNU89允许混合声明,例如

int i; i = 0; int j; 

我推断(错误地)来自SO上的一些其他post,例如C:for loop int initial declaration ,这意味着我可以做到

 for(int i=0; i<n; i++) 

使用GNU89但是当我这样做时,我得到了

 error: 'for' loop initial declarations are only allowed in C99 mode 

显然,混合声明和循环初始声明不是一回事(即一个并不暗示另一个)。

如果我只能有一个,我宁愿有循环初始声明。 当然,我可以使用GNU99,但这不是重点。 默认值是GNU89,它已经破坏了一些C89规则(它还允许BCPL / C ++样式注释)。 是否存在允许混合声明而不是循环初始声明的一些基本原因?

混合声明和语句早于其他​​语言的C89(例如,Algol 68),并且是少数C89编译器(不是MSCV)中的常见扩展。

另一方面, for语句中的计数器变量声明来自C到C ++ 98,据我所知,没有C89编译器发现它很有用,可以将它添加为C89扩展。