2012-02-29 88 views
1

我已经创建了一个C++程序,以测试通过引用为函数传递参数的功能。C++ - 在返回int的函数中通过引用传递参数

#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,但它不受程序执行的影响。

这是怎么发生的?

回答

5

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

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

与原有单一的输出语句:

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

编译器是免费的f(t)之前评估t,在生产你看到的输出。欲了解更多信息,请参阅cout << order of call to functions it prints?

+0

是的,但为什么它不会增加?是不是通过引用传递?它应该在'main'函数中被修改吗? – Simon 2012-02-29 16:48:48

+0

这是,只是你没有得到你所期望的订单,所有的产出在一条线上。将它拆分为两个保证事情按照您希望的顺序发生。 – BoBTFish 2012-02-29 16:50:31

+1

@Simon:不,它会增加't'。发生的事情是获取**打印**的值是函数调用之前的值。看到我更新的答案。 – NPE 2012-02-29 16:50:58

0

你的代码是未定义行为,因为它不是在一份声明中副作用发生在什么时候确定。

它类似于

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

取决于编译器,你可能会得到不同的结果。

0

我会想象你遇到涉及sequence points的问题。您正在修改并在相同的表达式中打印t的值。

编译器决定评估的顺序t以及何时决定评估f(t)未定义。所以这个函数可能不会像你想象的那样先被调用。

如果将打印分成两个语句,那么您将看到t实际上已更改。例如:

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

会产生您期望的输出。

0

该语言没有指定评估操作符参数的顺序,所以在函数调用之前或之后,您的cout表达式的值是t,因此未指定。

你会看到预期的结果,如果你介绍一个序列点,也许拆分为两个表达式:

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

你绊倒输出顺序。正如指出的那样,t确实得到递增,但是您可能在输出的顺序上感到困惑。

但是,我喜欢侧重于解决问题,试图弄清楚如何让人们理解不仅仅是眼前的问题,而是为什么他们首先遇到困难,这里我很清楚。

您需要了解调试器。

通过使用一个,你可以通过你的代码退一步,看看在任何给定的点t的价值,也看到,几乎没有在你的任何努力,这确实得到增加(确切地包括何时以及如何) 。通过使用包括递归等概念的调试器来追踪代码的工作方式,您也可以更好地理解代码是如何工作的。

我建议你马上开始,因为它会打开你的眼睛,看看代码是如何工作的,而不用猜测你的输出语句。