-2
#include<stdio.h>
#include<conio.h>

int f(int & ,int );//function prototype

main()
{
  int x,p=5; //p is initialized to 5
  x=f(p,p);
  printf("\n Value is : %d",x);//print the value of x
  getch();
}

int f (int & x, int c)
{
c=c-1;
if (c==0) return 1;
x=x+1;
return f(x,c) * x; //recursion
}

出力: 6561

誰か私にプログラムの流れを説明してもらえますか この質問はゲートからのものです 理解できませんでした。関数は p = 5 の値で呼び出されているようです。 int &x によって関数 f でキャッチされます 問題はここにあります。x または x のアドレスに格納されている値、つまり 5 です。

4

5 に答える 5

6

このコードでは、構文が意味するC++リファレンスを使用しています。int &

参照は、基本的に、ポインターの構文糖衣です。したがって、 を呼び出すf(p, p)と、関数の引数はinxへの参照になりますが、は呼び出し時の値のコピーにすぎません。pmain()c

これは、参照を通じてinfの値を変更できることを意味します。は自分自身を再帰的に呼び出し、同じ参照を自分自身に渡すため、常に in への参照になります。pmain()fpmain()

再帰を追跡するために、 内の戦略的な場所にログ出力を追加することをお勧めしf()ます。

于 2013-02-11T10:21:29.743 に答える
0

よりシンプル:

int f(int &a){
  a = 5;
}
int x = 0;
f(x);
//now x equals 5

int f2(int b){
 b = 5;
}
int y = 0;
f2(y);
//y still equals 0
于 2013-02-11T10:29:47.887 に答える
0

実際には、質問の参照部分は気を散らすことでした。x は p のアドレスを指しているだけですが、「x」自体には最初は値 5 が含まれていましたが、再帰は 4 回実行されました。スタックは ----[値 6 のとき x(スタックの一番下)、x 値 7 のとき、x 値が 8 のとき、x 値が 9 のとき(スタックの一番上)] ...一番上にあった9 しかし、再帰では最初のループ実行が行われ、次に評価が行われることがわかっているため、x の値が 9 に変更されると、スタックの 4 つのブロックすべてが同じ 'x' を指しているため、9 に変更されます.... 9*9*9*9=6561 という結果になりました。

于 2013-02-11T15:03:49.083 に答える
0

最初のreferenceものは、ポインターではなく、よりクリーンな構文に似た a を作成します。

これを使用して、関数呼び出し間で変数の内容を変更できます。

注意が必要ですが、投稿したコードは有効な C++ ではありません。C++ ではmain、戻り値の型がないと許可されません。

于 2013-02-11T10:22:25.103 に答える