6

我有这个 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, 有函数声明来代替这些参数应该去的参数。

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

4

4 回答 4

4

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()

于 2012-12-10T22:42:43.530 回答
4

这段代码绝对没有什么特别之处。这里没有任何“内置”内容。

这些是普通的函数指针。在 C 声明中

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

被自动解释为

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

函数sqpl作为参数传递给foo

foo(sq, pl, 1); // same as foo(&sq, &pl, 1)

&运算符是可选的)并通过内部的这些指针调用foo

int y = g(x,x); // same as (*g)(x,x)
return f(y,y);  // same as (*f)(y,y)

*调用中的运算符是可选的)。

在不知道你从哪里得到这些33923488价值观。函数指针不是“作为整数传递”。如果您的调试器决定将指针值显示为33923488,那一定是您的调试器有问题。

于 2012-12-10T22:44:00.643 回答
2

假设我理解你的问题并且可以记住任何 C 那么 foo 是一个函数,它接受指向2 个函数 f 和 g 加上一个 int 的指针,它返回一个 int。

f 和 g 都是接受 2 个整数并返回一个整数的函数。

你看到的数字是函数 pl 和 sq 的地址,所以看起来不错

您需要阅读有关将函数指针作为参数传递的信息,以更全面地解释正在发生的事情,这可能会有所帮助(即使它是 C++)http://www.oopweb.com/CPP/Documents/FunctionPointers/Volume/ CCPP/FPT/em_fpt.html

于 2012-12-10T22:42:34.080 回答
2
int foo(int f(int,int), int g(int,int), int x)

声明foo为一个接受三个参数的函数,前两个是(指向)函数,接受两个ints 作为参数并返回 an int,第三个参数是 an int

sq并且pl是适当类型的函数,所以调用

foo(sq, pl, 1)

是正确的。

于 2012-12-10T22:42:39.317 回答