这段代码有什么问题 - 在C ++中通过引用传递一个值?

时间:2013-11-30 14:02:48

标签: c++

所以我一直在尝试用C ++创建一个阶乘函数来计算一个数字的阶乘。

#include <iostream>
using namespace std;

int factorial(int& x)
{
  int b=x-1;

  if(x>1)
    return(x*=factorial(b));
  else
    return 1;
}

int main()
{
  int a;

  cout<<"Enter the number to get factorial (and press enter):\n";
  cin>>a;
  factorial(a);
  cout<<endl<<a;

  return 0;
}

上面的代码有效,但如果我替换此代码

return(x*=factorial(b));

return(x*=factorial(x-1));

它不起作用。 它报告错误说:“无效初始化'int&amp;'类型的非const引用来自'int'类型的右值,有人可以解释,我是初学者。

3 个答案:

答案 0 :(得分:3)

x - 1不是左值:它不指定存储,因此,您无法分配/修改它。暂时考虑一下:x - 1 *= <something>没有意义。因此,将rvalue传递给采用非const引用的函数是违法的。

答案 1 :(得分:1)

您通过引用获取int,并且您正尝试将rvalue绑定到它。 b是一个左值(你可以得到地址的东西),x - 1是一个表达式的结果,也就是一个右值(你不能得到地址的东西)。

答案 2 :(得分:0)

通过引用传递参数意味着当您调用

factorial(a);

该函数实际上是使用变量a地址调用的,因此该函数可以更改存储在那里的值。通过引用调用的函数必须始终获得一个 lvalue 的参数 - 一个可以在赋值语句左侧的值,因此编译器可以为函数提供该值的地址

如果您尝试调用这样的函数:

factorial(x-1);

编译器无法理解它,因为无法为x-1赋值。该表达式是 rvalue:,只能出现在赋值语句的右侧。

这解释了编译器的神秘错误消息:

  

'int&amp;'类型的非const引用的无效初始化来自'int'类型的右值

编译器需要factorial的参数为“int&amp;'”类型的非const引用,即对它可以修改的变量的引用(“non-const”)。你用x-1来调用它,它是“int类型的右值”,它告诉你没有任何意义。