【问题标题】:difference between int f(int &x) int f(int x)int f(int &x) int f(int x) 之间的区别
【发布时间】:2013-01-26 10:17:03
【问题描述】:
#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 的地址中。

【问题讨论】:

  • 这不是 C,int &amp; 语法是 C++。
  • 即使我昨天出现在 Gate 并且无法理解这个问题。希望有人能解释一下。
  • @user2060893 stackoverflow.com/questions/6877052/…看看这个问题

标签: c++ recursion


【解决方案1】:
  • &amp; 是引用:表示必须是对象的引用(地址);
  • * 是一个指针:它指向一个对象。

不同的是“&amp;x”不能是“NULL”,而是 &amp;x 可以是NULL

这两个原型是不同的。

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

这是个好问题。

【讨论】:

    【解决方案2】:

    实际上,问题中的参考部分是为了分散你的注意力,它只是 x 指向 p 的地址,但“x”本身第一次包含值 5,但递归运行了 4次,所以在堆栈中就像 ----[x 当值为 6(堆栈底部),xwhen 值为 7,xwhen 值为 8,x 当值为 9(堆栈顶部)] ...在顶部是 9,但正如我们所知,在递归中,首先执行循环,然后执行评估,因此当 x 的值更改为 9 时,堆栈的所有四个块都更改为 9,因为它们指向相同的“x”。 ...所以结果是 9*9*9*9=6561 ..就这么简单。

    【讨论】:

      【解决方案3】:

      更简单:

      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
      

      【讨论】:

      • 谢谢,对我很有帮助
      【解决方案4】:

      此代码使用C++ reference,这就是int &amp; 语法的含义。

      基本上,引用是syntactic sugar 的指针。所以当你调用f(p, p)时,函数参数x是对main()p的引用,而c只是调用时值的副本。

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

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

      【讨论】:

        【解决方案5】:

        第一个创建reference,它更像是一种更简洁的语法而不是指针。

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

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

        【讨论】:

          猜你喜欢
          • 2014-04-16
          • 2012-12-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-20
          相关资源
          最近更新 更多