Парсеры сначала проверяют синтаксис.Синтаксис определения функции: ( 6.9.1 )
определение функции:
declaration-specifiers declarator declaration-listopt compound-statement
В вашем случае declaration-specifiers
- это int
, declarator
- это main(void)
, и теперь вы находитесь в declaration-list_opt
, который поддерживает определения K & R, такие как int main(argc, argv) int argc; char **argv { }
.
Определение функции K & R с комментариями:
/*the old declarator mirrors usage
-- it takes an identifier list rather than a param-declarator list
(http://port70.net/~nsz/c/c11/n1570.html#6.7.6)
*/
int main(argc, argv)
/*the types of the identifiers are then declared*/
int argc;
char **argv;
/*and only then comes the function body
which is technically a compound statement
*/
{
}
В вашем случае, declaration-list_opt
соответствует:
int i, j, m[5][5];
, что семантически не имеет смысла с main(void)
(объявление массива не имеет смысла для любого декларатора функции, на самом деле, так как массивы передаются как указатели), но проверка, которая будет частью семантической проверки, которая обычно выполняется после проверки синтаксиса.
После declaration-list_opt
, compound-statement
(т.е., {}
- тело функции с скобками) синтаксически ожидается. for
не соответствует этому синтаксическому ожиданию.