【问题标题】:I want to know why only b is returned when I do like return(a,b)我想知道为什么当我喜欢 return(a,b) 时只返回 b
【发布时间】:2021-11-28 22:17:17
【问题描述】:
#include <iostream>
using namespace std;
int addmult(int ii, int jj);

int main() {
    int i = 3, j = 4, k, l;
    k = addmult(i, j); // 12
    l = addmult(i, j); // 12
    cout << k << "\n" << l; // 12 12 
}

int addmult(int ii, int jj) {
    int kk, ll;
    kk = ii + jj; // 7
    ll = ii * jj; // 12
    int a = (kk, ll);
    cout << "a = " << a << endl; // 12
    return a;
}; 

你好,我想知道为什么我这样返回时输出结果是12。 我就这样返回了 (val1, val2),但我发现只返回了 b。

【问题讨论】:

  • (kk, ll) 不是 C++ 中的元组。这是一个表达式,首先计算kk,然后计算ll。因此kk 被丢弃并且没有副作用。仅供参考:Comma operator。要构造元组,请查看std::pairstd::tuple。但是,函数的返回类型 int 不允许返回 tuples 或 pairs。对我来说,您似乎以前可能在 Python 中工作过。请考虑到 C++ 是一种非常不同的语言。
  • 简而言之:c++是一门必须先学习的语言
  • @Scheff'sCat - 在(kk, ll) 中,逗号运算符仅丢弃评估kk 的结果。它不能防止副作用。
  • @Peter 对int kk; 的读取权限有什么副作用?我同意任意表达式(恕我直言,这就是逗号运算符实际上是好的和有用的)但是一个普通的int 变量?
  • @Scheff'sCat - 它正在评估一个没有副作用的int 变量。您描述它的方式表明这是逗号运算符的属性,这是不正确的。

标签: c++ return tuples


【解决方案1】:

当您有一个表达式 (kk, ll) 时,它不会创建一个元组。相反,它计算两个表达式并返回ll 的值。所以addmult 函数最终只会返回那个值。

STL 中有std::pair 数据类型,它可以让您返回两个值。

std::pair<int, int> addmult(int ii, int jj) {
    int kk, ll;
    kk = ii + jj; // 7
    ll = ii * jj; // 12
    std::pair<int, int> a {kk, ll};
    cout << "a = " << a.first << ", " << a.second << endl;
    return a;
}

【讨论】:

    【解决方案2】:

    如果你想有多个返回值和可读的代码。 然后将您自己的返回类型定义为结构。 (对于配对,我总是不得不回顾第一个和/或第二个的含义。)

    #include <iostream>
    
    // declare a struct that can hold all your return values
    // and give them readable names.
    struct addmult_result_t
    {
        int addition;
        int multiplication;
    };
    
    // do your calculation and return the result
    addmult_result_t addmult(int ii, int jj) 
    {
        return addmult_result_t{ii + jj, ii * jj};
    }
    
    int main()
    {
        int i = 3, j = 4;
        auto result = addmult(i, j);
    
        std::cout << "addition = " << result.addition << "\n";
        std::cout << "multiplication = " << result.multiplication << "\n";
    
        return 0;
    }
    

    【讨论】:

    • 对于配对,我总是不得不回顾第一个和/或第二个的含义。公平点! :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-28
    • 2016-05-02
    • 2013-05-29
    • 1970-01-01
    • 1970-01-01
    • 2017-06-11
    相关资源
    最近更新 更多