【发布时间】:2012-12-10 22:35:26
【问题描述】:
我有这个 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,有函数声明来代替这些参数应该去的参数。
谢谢你, 编辑:很酷,非常感谢你们,这清除了一切!
【问题讨论】:
-
这是在编译吗?我不认为创建一个没有指针的函子这么容易.. 愚蠢的我,它一定是或者你怎么会看到“非常奇怪的值”
-
用
%p打印地址:printf("sq = %p\n", sq); -
foo 接受 3 个参数——两个函数(int,int)标识符/指针和一个整数。对 foo 的调用传递了两个函数和一个整数。这有点奇怪,但没有什么特别的异国情调。
-
它会编译并打印 4.
-
显然,它衰变为一个仿函数..学到了一些新东西..耶!
标签: c