所以我一直在尝试用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'类型的右值,有人可以解释,我是初学者。
答案 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类型的右值”,它告诉你没有任何意义。