Передача по ссылке в функции C ++ - PullRequest
1 голос
/ 16 февраля 2020

Я пишу простую программу для вычисления 6 ^ 5 с помощью функции. Вот мой код

#include <iostream>
using namespace std;

int raiseToPower(int &base, int exponent){
 for (int i = 1; i < exponent; i = i + 1){
   base= base * base;
   }
 return base;
}

int main() {
 int base = 6;
 cout << "6^5 is " << raiseToPower(base, 5)<< endl;

 return 0;
}

Результат

 6^5 is -683606016

вместо 7776

Не могли бы вы, ребята, объяснить мне, почему я получил этот результат? Я не ищу другой способ написания этого кода. Я знаю, что есть более простые способы, но я пытаюсь понять, что пошло не так

Ответы [ 4 ]

3 голосов
/ 16 февраля 2020

Почему вы используете передачу по ссылке. Установка максимально возможного значения const уменьшает вероятность ошибок:

#include <iostream>
using namespace std;

int raiseToPower(const int base, const int exponent) {
    int result = base;
    for (int i = 1; i < exponent; i = i + 1){
        result = result * base;
    }
    return result;
}

int main() {
    int base = 6;
    cout << "6^5 is " << raiseToPower(base, 5)<< endl;

    return 0;
}

Если это должно быть передать по ссылке , вы можете сделать это:

#include <iostream>
using namespace std;

void raiseToPower(const int base,
                 const int exponent,
                 int &result)
{
    result = base;
    for (int i = 1; i < exponent; i = i + 1){
        result = result * base;
    }
}

int main() {
    int base = 6;
    int result;
    raiseToPower(base, 5, result);

    cout << "6^5 is " << result << endl;

    return 0;
}
2 голосов
/ 16 февраля 2020

Давайте рассмотрим это l oop

 for (int i = 1; i < exponent; i = i + 1){
   base= base * base;
   }

После первой итерации, когда i равен 1, вы получите

   base= base * base;

, то есть результат base ^ 2.

Когда я = 2, у вас есть

   base= base^2 * base^2;

, то есть результат является основанием ^ 4.

Когда я равен 3, у вас есть

   base= base^4 * base^4;

то есть результат - база ^ 8.

Когда я равен 4, у вас есть

   base= base^8 * base^8;

, то есть результат - база ^ 16.

It Кажется, что полученное значение слишком велико для размещения в объекте типа int.

Также не очень хорошая идея, когда аргумент передается по ссылке. И второй параметр должен иметь тип unsigned int.

Вот демонстрационная программа, которая показывает, как эта функция может быть реализована.

#include <iostream>

long long int raiseToPower( int base, unsigned int exponent )
{
    long long int result = 1;

    while ( exponent-- )
    {
        result *= base;
    }

    return result;
}

int main() 
{
    int base = 6;

    std::cout << "6^5 is " << raiseToPower(base, 5) << std::endl;

    return 0;
}

Его вывод

6^5 is 7776
2 голосов
/ 16 февраля 2020

Вы, вероятно, хотите, чтобы ваш l oop был таким:

int result = 1;
for (int i = 0; i < exponent; i = i + 1) {
    result = result * base;
}
return result;

Кроме того, вы берете свой базовый параметр для подъема toToPower по ссылке - что означает, что вы меняете базовую переменную в main - вероятно, не то, что Вы хотите сделать.

2 голосов
/ 16 февраля 2020

Ваш расчет неверен. Значение переменной base не должно меняться. Попробуйте это:

 int raiseToPower(int &base, int exponent){
   int result = 1;
   for (int i = 1; i <= exponent; i = i + 1){
      result = result * base;
    }
    return result;
 }
...