gpt4 book ai didi

c - 当函数头后面没有复合语句时,C 理解什么?

转载 作者:太空宇宙 更新时间:2023-11-04 00:34:20 25 4
gpt4 key购买 nike

我想了解错误“'for' 之前的预期声明说明符”和“...'i' 之前的错误的性质

编译器实际上从中理解了什么

#include <stdio.h>

int main(void)
int i, j, m[5][5];
for (i = 0; i < 25; i++)
*(*m + i) = i;
i = 0, j = 0;

代码做什么并不重要(如果我将它包含在大括号中,代码会做什么)。我想知道如果函数头后面没有复合语句或分号(用于标记原型(prototype)),C 会在函数头之后期望什么。

提前致谢

最佳答案

解析器首先检查语法。函数定义的语法是 ( 6.9.1 )

function-definition:

   declaration-specifiers declarator declaration-listopt compound-statement

在你的例子中,declaration-specifiersintdeclaratormain(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(即,{}-braced 函数体)在句法上是预期的。 for 未能满足该句法期望。

关于c - 当函数头后面没有复合语句时,C 理解什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53877142/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com