【问题标题】:Some "weird" C code一些“奇怪”的 C 代码
【发布时间】: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


【解决方案1】:

fg 不是内置的。它们只是函数 foo() 的参数,正如您已经看到的那样。

此外,printf("sq = %d\n", sq); 是未定义的行为,因为sq 不是整数值,而是一个函数。它在这种情况下的地址。所以你应该写printf("sq = %p\n", sq);以便干净地输出函数的地址。

真正发生的是,您将函数 sq 作为参数 f 并将函数 pl 作为参数 g 提供给 foo()foo 使用参数x 调用这些函数。

所以基本上foo 调用pl(1,1) 并将结果存储到y 然后用于sq(y,y)。因此,它将工作委托给这些功能。这些函数可以看作是回调函数,因为foo()调用的是调用者给的函数。

到目前为止,sq()pl() 所做的事情超出了我的理解范围。

【讨论】:

    【解决方案2】:

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

    这些是普通的函数指针。在 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,那一定是您的调试器有问题。

    【讨论】:

      【解决方案3】:
      int foo(int f(int,int), int g(int,int), int x)
      

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

      sqpl 是适当类型的函数,所以调用

      foo(sq, pl, 1)
      

      是正确的。

      【讨论】:

        【解决方案4】:

        假设我理解您的问题并且可以记住任何 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

        【讨论】:

          猜你喜欢
          • 2014-05-18
          • 1970-01-01
          • 1970-01-01
          • 2017-08-25
          • 2011-07-08
          • 2014-04-09
          • 1970-01-01
          • 2015-03-24
          • 2014-02-21
          相关资源
          最近更新 更多