You need to go back to the syntax for a declaration:
Code:
declaration:
declaration-specifiers init-declarator-list_opt ;
So, the for loop syntax is actually equivalent to:
Code:
for ( declaration-specifiers init-declarator-list_opt ; expression_opt ; expression_opt ) statement
that's why later in clause 6.8.5.3 the standard expresses the two possibilities in a single form:
Code:
for ( clause-1 ; expression-2 ; expression-3 ) statement
but in this form the text then has to account for the different possibilities that clause-1 could take, i.e., declaration or expression.