我有这个C代码,我在理解时遇到了问题:

int foo(int f(int,int), int g(int,int), int x) {

    int y = g(x,x);
    return f(y,y);
}

int sq(int x, int y) {
    if (x == 1) { return y; }
    return pl(y, sq(x-1, y));
}

int pl(int x, int y) {
    if (x == 0) { return y; }
    return pl(x-1, y+1);
}

int main (int argc, const char * argv[])
{
   printf("sq = %d\n", sq);
   printf("output=%d\n", foo(sq, pl, 1));
   return 0;
}

我知道f正在乘两个变量,而g正在乘,它们显然是内置的。函数foo有两个参数声明为函数声明-> f(int,int)和g(int,int)。但是然后foo被传递了两个参数-sq和pl。这两个参数也具有非常奇怪的值-3392和3488,这些函数的逻辑地址是否为sq和pl?如果它们是并且它们以整数形式传递,那么foo如何接受它们?从foo开始,使用函数声明代替这些参数应进入的参数。

谢谢,
编辑:很酷,非常感谢你们,这一切都清理了!

最佳答案

fg不是内置的。它们只是foo()函数的参数,如您所见。

此外,printf("sq = %d\n", sq);是未定义的行为,因为sq不是整数值,而是函数响应。在这种情况下的地址。因此,您应该编写printf("sq = %p\n", sq);以便干净地输出函数的地址。

真正发生的是,您给foo()函数sq作为参数f和函数pl作为参数gfoo使用编写的参数x调用这些函数。

因此,本质上foo调用pl(1,1)并将结果存储到y中,然后将其用于sq(y,y)。因此,它将工作委派给这些功能。这些函数可以看作是回调函数,因为foo()调用了调用者给定的函数。

到目前为止,sq()pl()所做的事情超出了我的理解。

关于c - 一些 “weird” C代码,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13810468/

10-12 16:13