首页 > 解决方案 > 对为什么增量函数实际上不增加变量感到困惑

问题描述

我最近开始学习 C++,并开始观看来自名为 Cherno 的游戏开发者的一个有趣的视频系列。在了解了指针的工作原理后,我决定尝试学习引用的工作原理,在视频中,他给出了一个我有点困惑的示例代码片段。在我看来,输入到增量函数中的参数将返回其增量值是合乎逻辑的,但事实并非如此。对不起,如果这看起来很幼稚,我很新。这是我提到的代码片段。

#include <iostream>

#define log(x) std::cout << x << std::endl

void increment(int value) {
    value++;
}

int main() {
    int a = 5;
    increment(a);
    log(a);
}

编辑:在对代码进行了一些测试之后,我意识到当我在 void increment 函数内部而不是在 main 函数内部记录输出时,它返回了递增的值。这也让我和我最初的问题感到困惑。

标签: c++

解决方案


在这段代码中,你声明了一个函数,并带有一个按值传递给它的参数:

void increment(int value) {
    value++;
}

它真正做了什么,它增加了这个值......在函数内部,就是这样。它不返回值,也不更新任何其他变量。

有几种方法可以解决问题。

  1. 您可以以经典方式从函数返回值:
int increment(int value) {
   value++;
   return value;
}

int main() {
   int a = 5;
   a = increment(a);
   ...
}

在上面的例子中,新的值a将会增加。

  1. 您可以使用指针来更新在函数范围之外声明的变量。您可以将指针视为变量的地址。
void increment(int *pointer) {
   (*pointer)++;
}

int main() {
   int a = 5;
   a = increment(&a);
   ...
}

在上面的示例中,您a使用变量的地址(指针)更新了变量的值。

  1. 你可以使用参考。它们只是变量的代理,通常表现为指针。不同之处在于允许使用适合代理的语法:
void increment(int &proxy) {
   proxy++;
}

int main() {
   int a = 5;
   a = increment(a);
   ...
}

在这种情况下,代理只是在函数范围之外引用变量的一种方式,++ 将更新变量的值a


推荐阅读