-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 的值调用的。它在函数 f 中被 int &x 捕获,问题就在这里。是值,即 5 存储在 x 中还是 x 的地址中。

4

5 回答 5

6

此代码使用C++参考,这就是int &语法的含义。

基本上,引用是指针的语法糖。因此,当您调用 时f(p, p),函数参数是对inx的引用,而仅仅是调用时值的副本。pmain()c

这意味着可以通过引用f更改pin的值。main()由于f递归调用自身,将相同的引用传递给自身,因此它始终是对pin的引用main()

为了跟踪恢复,我建议在内部的战略位置添加日志打印输出f()

于 2013-02-11T10:21:29.743 回答
0

第一个创建的 areference更像是更简洁的语法而不是指针。

您可以使用它来更改函数调用之间的变量内容。

尽管您必须注意,您发布的代码不是有效的 C++。C++ 不允许main没有返回类型。

于 2013-02-11T10:22:25.103 回答
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 次,所以在堆栈就像 ----[x 当值为 6(堆栈底部),xwhen 值为 7,xwhen 值为 8,x 当值为 9(堆栈顶部)] ...在顶部9 但我们知道,在递归中,首先执行循环,然后进行评估,因此当 x 的值更改为 9 时,堆栈的所有四个块都更改为 9,因为它们指向相同的“x”......所以结果是 9*9*9*9=6561 ..就这么简单。

于 2013-02-11T15:03:49.083 回答
0
  • &是引用:这意味着它必须是一个对象的引用(地址);
  • *是一个指针:它指向一个对象。

不同的是“ &x”不能是“ NULL”,但 &x可以是NULL

这两个原型是不同的。

int f(int & ,int );
int f(int * ,int ); //are different function prototypes

这是一个很好的问题。

于 2019-11-04T10:57:37.990 回答