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