C++-在返回int的函数中通过引用传递参数

C++ - passing parameter by reference in a function which returns int

本文关键字:引用 参数 返回 int 函数 C++-      更新时间:2023-10-16

我创建了一个C++程序,以测试通过引用传递函数参数的功能。

#include <iostream>
using namespace std;
int f(int &b) {
    b = b + 1;
    cout << b << endl;
    return b;
}
int main() {
    int t = 10;
    cout << f(t) << " " << t << endl;
    //cout << f(&t) << " " << t << endl;
    system("PAUSE");
    return 0;
}

你能解释一下为什么这个程序在执行f函数后不会影响t的值吗?传递的b参数是引用,所以我认为它的值会在程序执行后发生变化,因为我使用的是主函数中的实际变量,而不是它的副本。在这种情况下,我希望它是11,但它不受程序执行的影响。

为什么会发生这种情况?

t的值会递增。如果您将输出语句一分为二,就会看到这一点:

cout << f(t) << endl;
cout << t << endl;

使用您的原始单一输出语句:

cout << f(t) << " " << t << endl;

编译器可以在f(t)之前自由评估t,从而生成您所看到的输出。有关更多信息,请参阅cout<lt;调用它打印的函数的顺序?

您的代码有未定义的行为,因为它没有定义在语句中副作用发生的时间点。

它类似于

cout << i++ << ++i;

根据编译器的不同,您可能会得到不同的结果。

该语言没有指定运算符参数的求值顺序,因此未指定cout表达式是在函数调用之前还是之后取t的值。

如果你引入一个序列点,你会看到预期的结果,也许可以把它分成两个表达式:

cout << f(t) << " ";
cout << t << endl;

您被输出顺序绊倒了。如前所述,t确实会递增,但您可能会对输出的顺序感到困惑。

然而,我喜欢回避一些问题,并试图弄清楚如何让人们不仅理解眼前的问题,而且理解他们最初遇到困难的原因,这一点我很清楚

您需要学习调试器

通过使用一个,您可以逐步遍历代码,在任何给定点看到t的值,也可以看到,几乎不需要您付出任何努力,它确实会增加(包括确切的时间和方式)。通过使用调试器(包括递归等概念)跟踪代码,您还可以更好地了解代码的工作方式。

我建议您立即开始这方面的工作,因为这将让您了解代码的实际工作方式,而无需通过输出语句来猜测。

我想您会遇到涉及序列点的问题。您正在同一表达式中修改和打印t的值。

编译器决定评估t的顺序和决定评估f(t)的顺序是未定义的。因此,函数可能不会像您想象的那样首先被调用。

如果您将打印分解为两个语句,那么您将看到t实际上发生了更改。例如:

cout << f(t) << " ";
cout << t << endl;

将具有您期望的输出。