2014-09-22 22 views
1

我知道以下关于参考无法预测返回参考的函数写入时的输出LHS

例如, int &ref=x; 然后ref和x是内存中相同位置的名称。 不像指针那样分配内存。

我正在用C++编写一个简单的交换程序,使用我成功编写的引用。

然后我决定尝试一下,当返回引用的函数是表达式的LHS时会发生什么,现在我无法预测下面的代码的输出。

#include<iostream.h> 

int & swap(int &,int &); //function returns reference 
void main() 
{ 
    int x=10,y=20; 
    int &ref1=x,&ref2=y; 
    swap(ref1,ref2)=x;   //what happens here? 
    cout<<x<<y; 
} 

int & swap(int &ref1,int &ref2) 
{ 
    int temp;   
    temp=ref1;  //swap 
    ref1=ref2;  //code 
    ref2=temp;  //here 

    return ref2;  //tried out this(has nothing to do with swapping) 
} 

O/P 20 20

+0

教育编写此类代码的人不要这样做。如果他们坚持不改变,找一种办法停止与他们合作。如果您是其中一员,请更改您的代码编写方式。 – 2014-09-22 19:01:24

+0

内存可能被分配给引用。 – 2014-09-22 19:16:54

回答

1

有两种可能的结果:

  1. “2010”
  2. “2020”

这取决于是否x上在左侧呼叫swap之前或之后阅读右侧。

该标准不禁止发生,只是它们没有交错。

+0

所以在我的情况下,x调用交换后读取..... – user3126632 2014-09-22 18:22:26

+0

是的,看起来像它。请记住,如果没有明显的原因,它可能会改变。 – Deduplicator 2014-09-22 18:23:59

+0

我尝试了一下:'x'总是先被评估,但结果取决于'operator ='的类型。如果使用'operator =(int&)',那么结果是“20 20”(即使用'x'的引用)。如果使用'operator =(int)',则在swap()之前复制'x'的值,结果为“20 10”。 – mariusm 2014-09-22 20:11:40