The biggest reason I know of is that it simplifies the language grammar and parser.
With the declarations up front, a block of code must look like
{
<declarations>
<stmts>
}
and consequently the definition of <stmts>
is simplified because it doesn't have to involve declarations. This, in turn, simplifies the parser, since it need only disambiguate statements from declarations at the start of a block.
In fact, this particular definition of the code block is codified in the standard:
3.6.2 Compound statement, or block
Syntax
compound-statement:
{ declaration-list<opt> statement-list<opt> }
declaration-list:
declaration
declaration-list declaration
statement-list:
statement
statement-list statement