猿问

从C+函数返回多个值

从C+函数返回多个值

是否有从C+函数返回多个值的首选方法?例如,假设一个函数将两个整数除以并返回商和余数。我通常看到的一种方法是使用引用参数:

void divide(int dividend, int divisor, int& quotient, int& remainder);

变体是返回一个值,并通过一个引用参数传递另一个值:

int divide(int dividend, int divisor, int& remainder);

另一种方法是声明一个包含所有结果的结构,并返回以下内容:

struct divide_result {
    int quotient;
    int remainder;};divide_result divide(int dividend, int divisor);

这些方法中的一种是普遍倾向的,还是有其他的建议?

编辑:在现实世界的代码中,可能有两个以上的结果.它们也可能是不同类型的。


MMMHUHU
浏览 497回答 3
3回答

回首忆惘然

在C+11中,您可以:#include&nbsp;<tuple>std::tuple<int,&nbsp;int>&nbsp;divide(int&nbsp;dividend,&nbsp;int&nbsp;divisor)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;&nbsp;std::make_tuple(dividend&nbsp;/&nbsp;divisor,&nbsp;dividend&nbsp;%&nbsp;divisor);}#include&nbsp;<iostream>int&nbsp;main()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;using&nbsp;namespace&nbsp;std; &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;quotient,&nbsp;remainder; &nbsp;&nbsp;&nbsp;&nbsp;tie(quotient,&nbsp;remainder)&nbsp;=&nbsp;divide(14,&nbsp;3); &nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;<<&nbsp;quotient&nbsp;<<&nbsp;','&nbsp;<<&nbsp;remainder&nbsp;<<&nbsp;endl;}在C+17中:#include&nbsp;<tuple>std::tuple<int,&nbsp;int>&nbsp;divide(int&nbsp;dividend,&nbsp;int&nbsp;divisor)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;&nbsp;{dividend&nbsp;/&nbsp;divisor,&nbsp;dividend&nbsp;%&nbsp;divisor};}#include&nbsp;<iostream>int&nbsp;main()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;using&nbsp;namespace&nbsp;std; &nbsp;&nbsp;&nbsp;&nbsp;auto&nbsp;[quotient,&nbsp;remainder]&nbsp;=&nbsp;divide(14,&nbsp;3); &nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;<<&nbsp;quotient&nbsp;<<&nbsp;','&nbsp;<<&nbsp;remainder&nbsp;<<&nbsp;endl;}或结构:auto&nbsp;divide(int&nbsp;dividend,&nbsp;int&nbsp;divisor)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;result&nbsp;{int&nbsp;quotient;&nbsp;int&nbsp;remainder;}; &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;result&nbsp;{dividend&nbsp;/&nbsp;divisor,&nbsp;dividend&nbsp;%&nbsp;divisor};}#include&nbsp;<iostream>int&nbsp;main()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;using&nbsp;namespace&nbsp;std; &nbsp;&nbsp;&nbsp;&nbsp;auto&nbsp;result&nbsp;=&nbsp;divide(14,&nbsp;3); &nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;<<&nbsp;result.quotient&nbsp;<<&nbsp;','&nbsp;<<&nbsp;result.remainder&nbsp;<<&nbsp;endl; &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;or &nbsp;&nbsp;&nbsp;&nbsp;auto&nbsp;[quotient,&nbsp;remainder]&nbsp;=&nbsp;divide(14,&nbsp;3); &nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;<<&nbsp;quotient&nbsp;<<&nbsp;','&nbsp;<<&nbsp;remainder&nbsp;<<&nbsp;endl;}

眼眸繁星

就我个人而言,我通常不喜欢返回参数,原因如下:在调用中,哪些参数是ins,哪些是Out,这并不总是显而易见的。通常您必须创建一个局部变量来捕获结果,而返回值则可以内联使用(这可能是一个好主意,也可能不是一个好主意,但至少您有此选项)。在我看来,有一个“在门”和一个“室外”功能似乎更干净-所有的输入都在这里,所有的输出都在那里。我喜欢尽量简短地列出我的论点。我对配对/元组技术也有一些保留。主要是,返回值往往没有自然的顺序。代码的读者如何才能知道结果。首先是商还是余数?实现者可以更改顺序,这会破坏现有的代码。如果值是相同的类型,这样就不会生成编译器错误或警告,这就特别危险了。实际上,这些参数也适用于返回参数。下面是另一个代码示例,这个示例不那么简单:pair<double,double>&nbsp;calculateResultingVelocity(double&nbsp;windSpeed,&nbsp;double&nbsp;windAzimuth, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; double&nbsp;planeAirspeed,&nbsp;double&nbsp;planeCourse);pair<double,double>&nbsp;result&nbsp;=&nbsp;calculateResultingVelocity(25,&nbsp;320,&nbsp;280,&nbsp;90); cout&nbsp;<<&nbsp;result.first&nbsp;<<&nbsp;endl;cout&nbsp;<<&nbsp;result.second&nbsp;<<&nbsp;endl;这是打印地面速度和航向,还是航向和地面速度?这并不明显。与此相比:struct&nbsp;Velocity&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;double&nbsp;speed; &nbsp;&nbsp;&nbsp;&nbsp;double&nbsp;azimuth;};Velocity&nbsp;calculateResultingVelocity(double&nbsp;windSpeed,&nbsp;double&nbsp;windAzimuth, &nbsp;&nbsp;&nbsp;&nbsp;double&nbsp;planeAirspeed,&nbsp;double&nbsp;planeCourse);Velocity&nbsp;result&nbsp;=&nbsp;calculateResultingVelocity(25,&nbsp;320,&nbsp;280,&nbsp;90); &nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;<<&nbsp;result.speed&nbsp;<<&nbsp;endl;cout&nbsp;<<&nbsp;result.azimuth&nbsp;<<&nbsp;endl;我觉得这更清楚。所以我认为我的第一选择一般是结构技术。在某些情况下,这对/元组的想法可能是一个很好的解决方案。如果可能的话,我想避免返回参数。
随时随地看视频慕课网APP
我要回答