我有这个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开始,使用函数声明代替这些参数应进入的参数。
谢谢,
编辑:很酷,非常感谢你们,这一切都清理了!
最佳答案
f
和g
不是内置的。它们只是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()
所做的事情超出了我的理解。
关于c - 一些 “weird” C代码,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13810468/