亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

從C+函數返回多個值

從C+函數返回多個值

C++
MMMHUHU 2019-06-24 10:36:34
從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);這些方法中的一種是普遍傾向的,還是有其他的建議?編輯:在現實世界的代碼中,可能有兩個以上的結果.它們也可能是不同類型的。
查看完整描述

3 回答

?
回首憶惘然

TA貢獻1847條經驗 獲得超11個贊

在C+11中,您可以:

#include <tuple>std::tuple<int, int> divide(int dividend, int divisor) {
    return  std::make_tuple(dividend / divisor, dividend % divisor);}#include <iostream>int main() {
    using namespace std;

    int quotient, remainder;

    tie(quotient, remainder) = divide(14, 3);

    cout << quotient << ',' << remainder << endl;}

在C+17中:

#include <tuple>std::tuple<int, int> divide(int dividend, int divisor) {
    return  {dividend / divisor, dividend % divisor};}#include <iostream>int main() {
    using namespace std;

    auto [quotient, remainder] = divide(14, 3);

    cout << quotient << ',' << remainder << endl;}

或結構:

auto divide(int dividend, int divisor) {
    struct result {int quotient; int remainder;};
    return result {dividend / divisor, dividend % divisor};}#include <iostream>int main() {
    using namespace std;

    auto result = divide(14, 3);

    cout << result.quotient << ',' << result.remainder << endl;

    // or

    auto [quotient, remainder] = divide(14, 3);

    cout << quotient << ',' << remainder << endl;}


查看完整回答
反對 回復 2019-06-24
?
眼眸繁星

TA貢獻1873條經驗 獲得超9個贊

就我個人而言,我通常不喜歡返回參數,原因如下:

  • 在調用中,哪些參數是ins,哪些是Out,這并不總是顯而易見的。
  • 通常您必須創建一個局部變量來捕獲結果,而返回值則可以內聯使用(這可能是一個好主意,也可能不是一個好主意,但至少您有此選項)。
  • 在我看來,有一個“在門”和一個“室外”功能似乎更干凈-所有的輸入都在這里,所有的輸出都在那里。
  • 我喜歡盡量簡短地列出我的論點。

我對配對/元組技術也有一些保留。主要是,返回值往往沒有自然的順序。代碼的讀者如何才能知道結果。首先是商還是余數?實現者可以更改順序,這會破壞現有的代碼。如果值是相同的類型,這樣就不會生成編譯器錯誤或警告,這就特別危險了。實際上,這些參數也適用于返回參數。

下面是另一個代碼示例,這個示例不那么簡單:

pair<double,double> calculateResultingVelocity(double windSpeed, double windAzimuth,
                                               
double planeAirspeed, double planeCourse);pair<double,double> result = calculateResultingVelocity(25, 320, 280, 90);
cout << result.first << endl;cout << result.second << endl;

這是打印地面速度和航向,還是航向和地面速度?這并不明顯。

與此相比:

struct Velocity {
    double speed;
    double azimuth;};Velocity calculateResultingVelocity(double windSpeed, double windAzimuth,
    double planeAirspeed, double planeCourse);Velocity result = calculateResultingVelocity(25, 320, 280, 90);
    cout << result.speed << endl;cout << result.azimuth << endl;

我覺得這更清楚。

所以我認為我的第一選擇一般是結構技術。在某些情況下,這對/元組的想法可能是一個很好的解決方案。如果可能的話,我想避免返回參數。


查看完整回答
反對 回復 2019-06-24
  • 3 回答
  • 0 關注
  • 530 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號