我有这个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开始,有函数声明来代替这些参数应该去的参数.
谢谢你,编辑:很酷,谢谢你们,很多人,清理了一切!
f和g不是内置的。它们只是 function 的参数foo(),正如您已经看到的。
此外,printf("sq = %d\n", sq);是未定义的行为,因为它sq不是一个整数值,而是一个函数。它在这方面的地址。所以你应该这样写printf("sq = %p\n", sq);,以便清楚地输出函数的地址。
真正发生的情况是,您将foo()函数sq作为参数f,并将函数pl作为参数g。foo使用所写的参数调用这些函数x。
因此,本质上foo是调用pl(1,1)并将结果存储到其中,y然后用于sq(y,y)。因此它将工作委托给这些功能。这些函数可以看作是回调函数,因为foo()调用的是调用者给出的函数。
到目前为止,做什么sq()和做什么已经超出了我的理解范围。pl()