一些"怪异"的C代码

use*_*063 6 c

我有这个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;
}
Run Code Online (Sandbox Code Playgroud)

我知道f乘以两个变量而g是乘法,它们显然是内置的.函数foo有两个参数声明为函数声明 - > f(int,int)和g(int,int).但是foo传递了两个参数 - sq和pl.这两个参数也有非常奇怪的值 - 3392和3488,是sq和pl函数的逻辑地址吗?如果它们是并且它们作为整数传递,foo如何接受它们?从foo开始,有函数声明来代替这些参数应该去的参数.

谢谢你,编辑:很酷,谢谢你们,很多人,清理了一切!

glg*_*lgl 4

fg不是内置的。它们只是 function 的参数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()