在 C++ 函数中通过引用传递

Passing by reference in C++ function

我正在编写一个简单的程序来使用函数计算 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

你们能解释一下为什么我会得到这个结果吗? 我不是在寻找另一种方式来编写这段代码。我知道有更简单的方法,但我想了解哪里出了问题

您的计算有误。变量 base 的值不应改变。试试这个:

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

您可能需要这样的循环:

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

此外,您正在通过引用将基本参数传递给 raiseToPower - 这意味着您正在更改 main 中的基本变量 - 可能不是您想做的。

你为什么使用引用传递。尽量设置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;
}

让我们考虑一下这个循环

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

在 i 等于 1 的第一次迭代后,你有

   base= base * base;

也就是结果是base ^ 2.

当 i = 2 你有

   base= base^2 * base^2;

即结果为base^4。

当 i 等于 3 时你有

   base= base^4 * base^4;

即结果是以^8为底。

当 i 等于 4 时你有

   base= base^8 * base^8;

即结果是以^16为底。

似乎结果值太大,无法容纳在 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