跳到C++第13章练习问题4-指针



我很难理解这个问题的措辞,以及通过指针参数返回第二个值意味着什么?

问题是:Write a function that takes input arguments and provides two seperate results to the caller, one that is the result of multiplying the two argumentsm the other the result of adding them. Since you can directly return only one value from a funciton you'll need the seecond value to be returned through a pointer or references paramter.

这就是我迄今为止所做的。

int do_math(int *x, int *y)
{
    int i =*x + *y;
    int u = *x * *y;
    int *p_u = &u;
    return i;
}
void caller()
{
    int x = 10;
    int y = 5;
    std::cout << do_math(&x, &y);
    //std::cout << *u;
}

我认为他们所希望你做的就是展示你对按值传递参数和按引用传递参数之间的区别的理解。

这里有一个示例代码显示,虽然我的函数只返回一个值"i=X+Y",但它也将Y的值更改为(Y*X)。

当然,如果您确实需要Y的值保持不变,您可以使用与Y的值相等的第三个变量,并将其引用作为额外的参数传递给您的函数。

您可以运行下面的代码来查看调用函数前后X和Y的情况。

希望这能有所帮助。

#include <iostream>
using namespace std;
int do_math(int value1, int *pointer_to_value2)
{
    int i = value1 * *pointer_to_value2; 
    *pointer_to_value2 = *pointer_to_value2 + value1;  // y changes here
    return i;
}

int main( int argc, char ** argv ) {
    int x = 10;
    int y = 5;
    cout << "X before function call " << x << endl;
    cout << "Y before function call " << y << endl;
    int product = do_math(x, &y);
    cout << "X after function call " << x << endl;
    cout << "Y after function call " << y << endl;
    cout << "What the function returns " << product << endl;
    return 0;
}

在分配中写入

编写一个接受输入参数的函数。。。

因此,不需要将这些输入参数声明为指针。该功能可能看起来像

int do_math( int x, int y, int &sum )
{
    sum = x + y;
    return  x * y;
}

int do_math( int x, int y, int *sum )
{
    *sum = x + y;
    return  x * y;
}

在这些函数定义中,和和和乘积可以作为参数和返回值进行交换

至于我,我会把函数写为

void do_math( int x, int y, long long &sum, long long &product )
{
    sum = x + y;
    product = x * y;
}

#include <utility>
//...
std::pair<long long, long long> do_math( int x, int y )
{
    return std::pair<long long, long long>( x + y, x * y );
}

void caller()
{
    int x = 10;
    int y = 5;
    std::pair<long long, long long> result = do_math( x, y );
    std::cout << "Sum is equal to " << result.first 
              << " and product is equal to " << result.second
              << std::endl;
}

编辑:我想解释一下为什么会这样说

std::cout << "sum is " << do_math(x, y, result) << " and result is " << result;

是错误的。

未指定子表达式和函数参数的求值顺序。因此,在上面的语句中,一些编译器可以在求值函数调用do_math(x,y,result)之前输出result的值

因此,程序的行为将是不可预测的,因为根据编译器的使用,您可能会得到不同的结果。

编辑:对于来自注释的代码,它应该看起来像

#include <iostream> 
int do_math( int x, int y, int *p_u ) 
{ 
    int i = x + y; 
    *p_u = x * y; 
    return i; 
} 
int main() 
{ 
    int x = 10; 
    int y = 5; 
    int u; 
    int i = do_math( x, y, &u ); 
    std::cout << i << std::endl; 
    std::cout << u << std::endl; 
}

还要考虑到,在一般情况下,最好将变量i和u定义为具有类型long long,因为例如,两个大整数的乘积不适合int类型的对象。

措辞有点做作,但我相信任务要求你进行

  • 返回乘法作为函数的返回值,以及
  • 由于不能同时返回两个类型(除非以某种方式将它们包装起来),因此应该使用第三个参数作为总和的存储区域:

    #include <iostream>
    /* Multiplication in here */ int do_math(int x, int y, int& result/* Addition in here */)
    {
        result = x + y;
        return x*y;
    }
    int main() {
        int x = 10;
        int y = 5;
        int addition = 0;
        int multiplication = do_math(x, y, addition);
        std::cout << "multiplication is " << multiplication << " and sum is " << addition;
    }
    

示例

它并没有特别要求您为函数使用两个参数

练习文本的意图的典型解决方案…

"编写一个函数,接受输入参数,并向调用方提供两个独立的结果,一个是两个参数相乘的结果,另一个是将它们相加的结果。由于一个函数只能直接返回一个值,因此需要通过指针或引用参数返回第二个值

…是

auto product_and_sum( double& sum, double const a, double const b )
    -> double
{
    sum = a + b;
    return a*b;
}
#include <iostream>
using namespace std;
auto main() -> int
{
    double product;
    double sum;
    product = product_and_sum( sum, 2, 3 );
    cout << product << ", " << sum << endl;
}

这段代码是不自然的,因为一个结果被返回,而另一个是out参数。

这样做是因为练习文本表明应该这样做。

一种更自然的方法是同时返回两者,例如std::pair:

#include <utility>      // std::pair, std::make_pair
using namespace std;
auto product_and_sum( double const a, double const b )
    -> pair<double, double>
{
    return make_pair( a*b, a+b );
}
#include <iostream>
#include <tuple>        // std::tie
auto main() -> int
{
    double product;
    double sum;
    tie( product, sum ) = product_and_sum( 2, 3 );
    cout << product << ", " << sum << endl;
}

如第二个程序所示,练习文本的最后一句

"由于一个函数只能直接返回一个值,因此需要通过指针或引用参数返回第二个值

…这不是真的。我怀疑作者的意思是";直接";以澄清这排除了非基本类型的情况。但即便如此,结论还是不正确的。

您需要做的是为函数提供另一个参数-指向要存储其他结果的变量的指针或引用:

int do_math(int *x, int *y, int &res) //or int *res
{
    ...
    res = *x * *y;
    ...
}

然后在main中生成一个结果变量,并将其传递给函数

相关内容

  • 没有找到相关文章

最新更新