1


0

プログラムの出力?
#include

int fun(int, int);
typedef int (*pf) (int, int);
int proc(pf, int, int);

int main()
{
    printf("%d\n", proc(fun, 6, 6));
    return 0;
}
int fun(int a, int b)
{
   return (a==b);
}
int proc(pf p, int a, int b)
{
   return ((*p)(a, b));
}

5 Answer


4


プログラムの出力は次のとおりです。

1

では、そこで何が起こっているのか見てみましょう。

#include

この行には、標準の入出力機能のみが含まれています。

int fun(int, int);

これはコンパイラーに伝えます:OK、2つの int`変数を取り、 int`を返す `fun`という名前の関数があります。

typedef int (*pf) (int, int);

これにより、「int」を返す2つの「int」変数を取る関数へのポインターへのショートカットがインストールされるため、この種の関数ポインターは「pf」を使用して短縮できます。

int proc(pf, int, int);

コンパイラーに指示します:OK、 pf`変数をとる proc`という関数があります(上記で見たように、 int`を返す2つの int`変数をとる関数への関数ポインター)、 int`変数、 `int`を返します。

int main()
{
    printf("%d\n", proc(fun, 6, 6));
    return 0;
}

プログラムの実行時に実行される中央手順。 プログラムに数字( %d)と改行(` \ n`)を出力するように指示します。 番号は「proc(fun、6,6)」の値を持ちます。

int fun(int a, int b)
{
   return (a==b);
}

ここに、 fun`が行うべき機能があります。 この関数は、 `a`と b`を比較し、等しい場合は1を返し、等しくない場合は0を返します(Cの `==`の結果の定義のみ)。

int proc(pf p, int a, int b)
{
   return ((*p)(a, b));
}

ここに、 proc`が実際に行うことを示します。これは、関数ポインタ(上記で見たように-…​) p`と2つのintを取ります。 次に、与えられた2つの引数( a`と b`)に適用された与えられた関数( p)を呼び出し、` p`の結果を返します。

ですから、 proc(fun、6、6)`を呼び出すと、 `proc`は fun(6,6) を呼び出します。これは1に評価され( 6 == 6`であるため)、この結果( `1 `)。

したがって、出力はちょうど

1

*しかし、正直に:*質問する前に、いくつかのことを見て、自分で物事を理解してみてください(なぜこれがそうなのか):


2


タイプpfは関数タイプです。 main()では、関数funが関数procに渡されるため、次のようになります。

proc(fun, 6, 6) = fun(6, 6) = 6==6 = 1


2


 printf("%d\n", proc(fun, 6, 6));

procの結果を* int *として出力します。

 return ((*p)(a, b));

p(a、b)、ergo `fun(6,6)`を実行した結果を返します

 return (a==b);

「6 == 6」は「true」を返し、* int に等しい 1 *にキャストされます。

すべての理由:

int(true) == 1

行に関して:

return ((*p)(a, b));
  1. と同じです。

return (*p)(a, b);

ここで行っているのは、関数ポインタ `p`を逆参照することで、渡されたパラメータを使用して呼び出しを行うことができます。 `(* p)`は逆参照されたポインターで、 `(a、b)`はパラメーターです。 「p」は「fun」を指すため、「* p」は「fun」です。


0


1

「fun」への関数ポインタはprocに渡され、6 == 6を評価し、trueを返します。これは暗黙的に「1」に変換されます。


0


true(別名1)を返しています。 intを返すため、「boolean」値は暗黙的に「true」から「1」に変換されます。 プログラムは正常に動作しています。 6は6に等しく、trueまたは1になります。