我知道这里存在类似的问题,但我在这些日子里看到了这个算法,并对它的实现方式感到惊讶。考虑以下功能
int divide(int numerator, int denominator, int &remainder) {
remainder = numerator % denominator;
return numerator / denominator;
}
它是通过引用而不是值本身实现的功能 这是最终代码
int main() {
int num = 14;
int den = 4;
int rem;
int result = divide(num, den, rem);
cout << result << "*" << den << "+" << rem << "=" << num << endl;
} 结果将以评论表格
撰写// 3*4+2=12
我的问题是,当函数从除法函数范围返回一个值时,它如何确定第二个或提醒术语?请帮帮我。这是来自麻省理工学院官方网站的令牌。非常感谢
答案 0 :(得分:2)
正如您所说,rem变量通过引用传递
答案 1 :(得分:2)
该函数的第三个参数是引用,这意味着它是传入的参数的别名。
当调用者传递名为rem
的变量(左值)时,该函数将使用自己的参数remainder
对该变量进行别名。对remainder
的所有更改实际上都是rem
的更改。所以从某种意义上说,函数会从调用者的范围中填充变量。
答案 2 :(得分:2)
变量rem
内的值将是函数完成后的余数值。这是因为divide()
函数接受remainder
参数作为引用类型,这意味着当在divide()
函数体内访问引用变量时,它实际上是访问原始变量记忆中的位置。因此,当您在函数体中设置引用变量remainder
的值时,它会影响rem
变量的原始内存地址的值,并且从divide()
返回后函数,即使在函数返回后,对原始rem
变量的更改仍然存在,因为该地址的值已更改。
因此,通过引用传递参数,您可以更改函数范围之外的多个值,从而有效地执行与返回多个变量相同的操作。
这是因为引用基本上是隐式指针...所以当您访问或更改引用变量的值时,它正在更改或访问引用绑定到的原始内存地址处的值。作为指针的引用的“隐式”特性是引用在创建时“绑定”到内存地址,因此不能为NULL,并且编译器会自动解除引用,因此省略了对手册的需要解除正常指针的引用。因此,你永远不可能创建一个“裸”的引用,如:
int& int_reference;
这会引发编译器错误。相反,引用总是必须“绑定”到实际的内存地址(即内存中的实际变量),如下所示:
int actual_variable;
int& int_reference = actual_variable;
现在int_reference
已“绑定”到actual_variable
,每当您更改int_reference
的值时,您正在更改actual_variable
所代表的内存位置的值。所以,如果你做了
int_reference = 5;
然后actual_variable
的值也会为5.
将值传递给具有该数据类型作为引用的函数时,也会发生引用的“绑定”操作。例如:
void func(int& a)
{
a = 5;
}
int main()
{
int b = 2;
func(b);
std::cout << b; //a value of "5" will be printed
return 0;
}
函数func()
将更改b
所代表的内存地址的值,因为我们在调用b
时引用了func()
。将b
作为对func()
的引用传递的行为称为“传递引用”。因此,您可以通过传入多个变量作为对函数的引用,有效地将多个值“返回”回调用函数。调用函数的副作用将改变您通过引用传入的值,这类似于您是否可以实际从函数本身返回多个值(但效率更高)。
答案 3 :(得分:1)
传递给函数的余数是一个非const引用,因此可以在函数内部更改该值,并且当函数返回时它将在函数外部可见。
答案 4 :(得分:1)
如果您想从函数中返回多个值,可以使用Boost Tuple Library进行此操作。
答案 5 :(得分:1)
我不喜欢输出参数。所以这是一个迭代返回所有值的解决方案 您可以使用boost :: tie并从函数中返回对(或tupples)。
#include <iostream>
#include <utility>
#include "boost/tuple/tuple.hpp"
std::pair<int,int> divide(int numerator, int denominator)
{
int remainder = numerator % denominator;
int result = numerator / denominator;
return make_pair(remainder, result);
}
int main()
{
int res;
int rem;
boost::tie(rem,res) = divide(10,3);
std::cout << rem << ": " << res << "\n";
}