简体   繁体   中英

about return type from a function

Here I have written some code to get the square of a number from a function, but the return statement is not working as desired by me, it is giving me the same number which I have entered, I want to know the reason behind this, please if any one can explain this to me...

#include<iostream>
#include<conio.h>

using namespace std;
int square(int &i);

int main()
{
    cout<<"enter the number whose square you want to find";
    int a;
    cin>>a;
    square(a);

    cout<<"the square of the number is"<<a;
    _getch();
    return 0;
}

int square(int &i)
{
    return i*i;
}

You're ignoring the returned value. You should store it as:

int value = square(a);
cout<<"the square of the number is "<< value;

Also, as the type is just integral type, passing by reference doesn't give you much advantage. I would suggest to use pass by value for its readability sake:

int square(int i)
{
    return i*i;
}

--

Or in case if you're experimeting with reference, and trying to learn it, then in that case I would say that you've to store the result of product in the argument itself, as:

int square(int &i)
{
    i = i * i; //this updates i here, and at the call site as well
    return i; 
}

Or simply do this:

int square(int &i)
{
   return i = i*i; //multiply, update, and return - all in one statement!
}

You do not obtain the result. Your line should be: a = square(a); to fetch the result from the function. The other possibility would be to write in the function

int square(int &i)
{
    i = i * i;
    return i;
}

The latter will alter the variable you passed to the function which justifies passing a reference.


To make it clear you want to alter the variable do something like:

void square(int &i)
{
    i = i * i;
}

You see there is no return involved but it will alter the variables value.

You have a choice:

  1. Modify the parameter you pass in, or
  2. Return a value and assign it to something in the calling scope.

What you are doing in square is the second option. You seem to want the first.

If what you really want is to modify the passed-in value, then what you need is this:

void square(int &i)
{
    i = i*i;
}

Either do it this way:

  a = Square (a) ; // in main()
  ...
int Square (int i) // Pass by value -- doesn't change a in main
  {
  return i * i ;
  }

or do it this way:

  Square (a) ; // in main()
  ...
void Square (int& i) // Pass by reference -- changes a in main
  {
  i = i * i ; // No need for a return value
  }

Make sure you understand the difference before you program anything else!

Judging by your comments on the answers, you've misunderstood what passing by reference does OR you've misunderstood return.

I'm assuming you're thinking that the variable i will be updated in your program. However, this is not the case. If you did something like...

i = i*i;

then yes, you would be correct. However, you did not assign any value to i, you simply multiplied it by itself and returned the result. Also, if you truly wanted to make this work based on a reference, there would be no need to return anything, as the variable would be updated via the reference.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM