“我如何阅读?”;int(*functionFactory(intn))(int,int){…}";?

“我如何阅读?”;int(*functionFactory(intn))(int,int){…}";?,c,C,这是一个语法问题。我强调我想了解如何阅读下面的代码 我很难理解下面的代码(1)是如何翻译成下面的代码(2)的: 零码: int addInt(int n, int m) { return n+m; } 代码一: // this is a function called functionFactory which receives parameter n // and returns a pointer to another function which receives two int

这是一个语法问题。我强调我想了解如何阅读下面的代码

我很难理解下面的代码(1)是如何翻译成下面的代码(2)的:

零码:

int addInt(int n, int m) {
    return n+m;
}
代码一:

// this is a function called functionFactory which receives parameter n
// and returns a pointer to another function which receives two ints
// and it returns another int
int (*functionFactory(int n))(int, int) {
    printf("Got parameter %d", n);
    int (*functionPtr)(int,int) = &addInt;
    return functionPtr;
}
代码二:

typedef int (*myFuncDef)(int, int);
// note that the typedef name is indeed myFuncDef

myFuncDef functionFactory(int n) {
    printf("Got parameter %d", n);
    myFuncDef functionPtr = &addInt;
    return functionPtr;
}
我正在为两件事挣扎,这就是原因。我已经将上面的代码修改为我认为它们应该是什么样子

不带Typedef的显式函数定义(应与标题相同:

代码4:

int (*myFuncDef)(int, int) functionFactory(int n) {
    printf("Got parameter %d", n);
    int (*functionPtr)(int,int) = &addInt;
    return functionPtr;
}
代码5: typedef本身(用于在代码2中简化):

请注意,这些规则规定了基本规则:返回类型、标识符、参数。

如果能给我一个链接,我会非常感激,在那里我可以阅读关于这一切如何运作的严格规则。如果能给我一个概述性的解释,那就太好了,因为没有像“教程”那样的课程。 多谢各位

[编辑]还有

注意,这些是摘录自:

int(*functionFactory(intn))(int,int){…}?

Remember these rules for C declares
And precedence never will be in doubt
Start with the Suffix, Proceed with the Prefix
And read both sets from the inside out
(当然,除非帕伦斯说“先做这个”

那么:工厂是什么

[open paren] 
[suffix (int n)]     a function taking an `int` argument called `n` that returns
[prefix *]           a pointer to
[close paren]
[suffix (int, int)]  a function taking two `int` arguments and returning
[prefix int]         an integer
下面的
{…}
给出了
函数工厂
行为的定义

(我们可能已经能够从名称
functionFactory
猜出它将返回一个指向函数的指针。我们也可以查看它的逻辑,看看它返回的是什么类型。)

typedef使用与变量声明完全相同的语法,用新的类型名称替换变量名称,当然还有前面的
typedef
关键字。此工厂返回的类型的函数指针将具有

int (*functionFromFactory)(int,int); /* oops, forgot parens the first time */
所以这种指针的typedef是

typedef int (*PtrToFunctionFromFactory)(int,int);
请注意,一旦有了该类型,
functionFactory
的声明就可以简化为

PtrToFunctionFromFactory functionFactory(int n) {...}
(这类函数可能有一个比“来自工厂的函数”更好的名称,而且这个名称真的应该在typedef和工厂方法的名称中使用,但是由于您没有给我们提供更好的名称,所以我有点拘泥于过于抽象的名称。)

希望对您有所帮助。

int(*functionFactory(intn))(int,int){…}?

Remember these rules for C declares
And precedence never will be in doubt
Start with the Suffix, Proceed with the Prefix
And read both sets from the inside out
(当然,除非帕伦斯说“先做这个”

那么:工厂是什么

[open paren] 
[suffix (int n)]     a function taking an `int` argument called `n` that returns
[prefix *]           a pointer to
[close paren]
[suffix (int, int)]  a function taking two `int` arguments and returning
[prefix int]         an integer
下面的
{…}
给出了
函数工厂
行为的定义

(我们可能已经能够从名称
functionFactory
猜出它将返回一个指向函数的指针。我们也可以查看它的逻辑,看看它返回的是什么类型。)

typedef使用与变量声明完全相同的语法,用新的类型名称替换变量名称,当然还有前面的
typedef
关键字。此工厂返回的类型的函数指针将具有

int (*functionFromFactory)(int,int); /* oops, forgot parens the first time */
所以这种指针的typedef是

typedef int (*PtrToFunctionFromFactory)(int,int);
请注意,一旦有了该类型,
functionFactory
的声明就可以简化为

PtrToFunctionFromFactory functionFactory(int n) {...}
(这类函数可能有一个比“来自工厂的函数”更好的名称,而且这个名称真的应该在typedef和工厂方法的名称中使用,但是由于您没有给我们提供更好的名称,所以我有点拘泥于过于抽象的名称。)

希望有帮助。

“由内而外,从右到左。”

从声明的名称中,该级别从右到左是“接受一个整数的函数返回指针…”,“输出一个级别”…到接受两个整数的函数返回一个整数“

”从内到外,从右到左。”


从声明的名称开始,该级别从右到左依次为“接受整数的函数返回指针…”,从“一级”到“接受两个整数的函数返回整数”.

我曾使用过该网站,但我不想依赖它。我希望自己能够阅读该网站。但我找不到严格描述it工作方式的规范。可能重复的重复,一个可能永远不会被问到的问题,因为此类代码的读者只会有相同的问题。此外,如果你想参考C语言中的任何东西。我使用了那个网站,但我不想依赖它。我想自己能够阅读这个。但我找不到严格描述it工作方式的规范。可能重复的重复,一个可能永远不应该被问到的问题,因为这样的代码的读者只会有相同的问题。而且,如果如果你想用C语言解析任何东西,请参阅。这会是更好的英语,@Potatoswatter…但它扫描起来不那么好,也不那么容易记住。我花了很多精力来构建记忆功能(是的,它是我的,大约20年前在C论坛的日子里),我认为它已经达到了它可能会达到的最佳状态。如果你想有所贡献,我很想找到一种优雅的方式,将关于括号的警告加入其中…绝对是很棒的链接!(是你把它作为副本放的吗?)请允许我问一个问题:声明和定义是如何在C中定义的?在规范中我会在哪里找到它?我开始认为我应该清理我的旧
cex
工具(C解释者),这是一个将C声明翻译成英语的简单解析器。上帝只知道我把代码放在哪里……可以说,任何如此复杂的东西都应该使用typedef分阶段构建,但有时代码只是“增长了一些”直到它变得令人毛骨悚然。哦,这首诗也很好:P。我强烈倾向于删除这个问题,因为那个副本实际上正是我要找的,但我给你的帮助提供了正确的答案。谢谢ton@user2316667现在我为建议复制感到抱歉,因为这是一个极好的答案