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が2つの変数を乗算し、gが乗算していることを理解しました。これらは明らかに組み込まれています。関数fooには、関数宣言として宣言された2つのパラメーターがあります-> f(int、int)およびg(int、int)。しかし、fooは2つの引数(sqとpl)で渡されます。2つの引数にも非常に奇妙な値があります-3392と3488、これらの関数の論理アドレスはsqとplですか?それらが整数として渡される場合、fooはどのようにそれらを受け入れますか?fooなので、これらの引数が置かれるべきパラメーターの代わりに関数宣言があります。

ありがとう、編集:かっこいい、みんなありがとう、それは物事を片付けた!

4

4 に答える 4

4

fとは組み込まれていません。すでにご覧gのとおり、これらは関数の単なるパラメータです。foo()

その上、整数値ではなく、関数respである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)

*呼び出しの演算子はオプションです)。

3392あなたがこれらと価値観をどこで手に入れたのかわからない3488。関数ポインタは「整数として渡される」わけではありません。デバッガーがポインター値を3392およびとして表示することを決定した場合は、デバッガー3488に問題があるはずです。

于 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は3つの引数を取る関数として宣言し、最初の2つは2つintのsを引数として取り、を返す関数(ポインタ)ですint。3番目の引数はint。です。

sqおよびplは適切なタイプの関数であるため、

foo(sq, pl, 1)

正しい。

于 2012-12-10T22:42:39.317 に答える