跳转到C ++第13章练习Prob No4 - 指针

时间:2014-10-26 13:16:35

标签: c++ function pointers

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

问题是: 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;
}

5 个答案:

答案 0 :(得分:1)

我认为他们希望你做的就是证明你理解按值传递参数和通过引用传递它们之间的区别。

这是一个示例代码,显示虽然我的函数只返回一个值&#34; i = X + Y&#34;,它也将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;
}

答案 1 :(得分:0)

措辞有点人为,但我相信任务要求你

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

    #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;
    }
    

Example

并没有特别要求您为该功能使用两个参数

答案 2 :(得分: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;
}

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

至于我,我会把这个函数写成

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类型的对象。

答案 3 :(得分:0)

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

  

编写一个接受输入参数的函数,并为调用者提供两个单独的结果,一个是两个参数相乘的结果,另一个是添加它们的结果。由于您只能直接从函数返回一个值,因此您需要通过指针或引用参数返回的返回值

...是

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-argument。

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

更自然的方法是同时返回两者,例如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;
}

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

  

由于您可以直接从函数返回一个值,因此您需要通过指针或引用参数返回的返回值

......是不正确的。我怀疑提交人的意思是“直接”,以澄清这排除了非基本类型的情况。但即便如此,结论也是不正确的。

答案 4 :(得分:-1)

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

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

然后在main中创建一个结果变量并将其传递给函数