谁能回答:为什么x1=x,但输出结果不相等?

Chrisma 2003-03-17 12:07:39
#include <iostream.h>
int &f(int i)
{
int &j=i;
return j;
}
void main(void)
{
int &x=f(10), x1=x;
cout<<"x="<<x<<",x1="<<x1<<"\n";
}
...全文
29 38 打赏 收藏 转发到动态 举报
写回复
用AI写文章
38 条回复
切换为时间正序
请发表友善的回复…
发表回复
WeltactXp 2003-03-17
  • 打赏
  • 举报
回复
是呀,那时系统还没有撤回临时空间
Chrisma 2003-03-17
  • 打赏
  • 举报
回复
#include <iostream.h>
int &f(int i)
{
int &j=i;
return j;
}
void main(void)
{
int &x=f(10), x1=x;
//此时,用调试工具看, x和x1的值又相等
cout<<"x="<<x<<",x1="<<x1<<"\n";
}
huangqd 2003-03-17
  • 打赏
  • 举报
回复
so confused,我在VC下测试都可以,然道是编译器的问题?
WeltactXp 2003-03-17
  • 打赏
  • 举报
回复
f(10)调用的结果存储在一个临时变量里面,而你的引用x正好引用这块临时内存,所以一旦执行下一条语句临时变量被回收之后,x就没地方引用了,出现的就是乱七八糟的不确定数字

这样改:
void main(void)
{
int temp = f(10);
int &x=temp, x1=x;
cout<<"x="<<x<<",x1="<<x1<<"\n";
}
Meyer 2003-03-17
  • 打赏
  • 举报
回复
#include <iostream>

using std::cout;
using std::endl;

int &f(int i)
{
cout << "&i\t" << &i << endl; //两次调用显示 i的地址一样的
int &j=i;
return j;
}

int main(void)
{
int &x=f(10);
f(12); //再调用一次,改变堆栈。
int x1=x;
cout<<"x="<<x<<",x1="<<x1<<"\n";

system( "pause" );
return 0;
}

这次的结果 12 ,12
oyd 2003-03-17
  • 打赏
  • 举报
回复
gz
LionEagle 2003-03-17
  • 打赏
  • 举报
回复
同意JoshuaLi

因为C/C++函数参数是传值的,因此 int& j=i实际上是引用了堆栈中的临时变量,因此堆栈中该位置的值一旦改变,main中的x的值也就随着改变

验证如下:

int& f( int i )
{
int& j = i;
return j;
}

void g( int i )
{
}

void main
{
int& x = f( 10 );
g( 13 );
return; // 此时用调试器查看x的值,应该为13,因为调用g(13)时将13压栈,其
// 置正好是x引用的位置
// 不能用打印的方式观察x,因为可能会改变堆栈
}
Meyer 2003-03-17
  • 打赏
  • 举报
回复
我也想叨叨两句。 我的代码结果都是 10 ,10;
#include <iostream>
using std::cout;
int &f(int i)
{
int &j=i;
return j;
}
int main(void)
{
int &x=f(10);
int x3=x;
int x2=x;
int x1=x;

cout<<"x="<<x<<",x1="<<x1<<"\n";

system( "pause" );
return 0;
}
但我觉得这个程序本身就有问题。 int &f(int i //传递的是值) 按照 C/C++默认的 __cdecl调用规着这个 i是在栈中的由 调用者 这里是 main() 建立和释放 按照道理
call _f 之后就应该出栈,这个i就不存在了,int &x=f(10);这个 x引用的是 不存在的 i,我认为迟早要出问题,就看运气好不好了。
但我用 GCC3.2 的结果是他一直是10 :(

bm1408 2003-03-17
  • 打赏
  • 举报
回复
f(10)调用的结果存储在一个临时变量里面,而你的引用x正好引用这块临时内存,所以一旦执行下一条语句临时变量被回收之后,x就没地方引用了,出现的就是乱七八糟的不确定数字


原因就是变量的生存期不同!
好好看看书!
wshcdr 2003-03-17
  • 打赏
  • 举报
回复
各讲各的理

原因到底是什么呢?
weasea 2003-03-17
  • 打赏
  • 举报
回复
mark
JoshuaLi 2003-03-17
  • 打赏
  • 举报
回复
int &f(int i)
/*形参等同局部变量,在作用域之外无效。申明形参时分配了空间且是局部的。对形参的引用如同anto量。尽管最终是引用实参,但他直接引用的是形参*/
{
int &j=i;
return j;
}
WeltactXp 2003-03-17
  • 打赏
  • 举报
回复
得先弄明白一个问题:引用分配空间么

JoshuaLi 2003-03-17
  • 打赏
  • 举报
回复
>你没有注意到j只是i的引用,i是调用函数传进来的

至少 int &j 是一个auto量吧
WeltactXp 2003-03-17
  • 打赏
  • 举报
回复
回复人: JoshuaLi(听说有人懂C++就会佩服得要死) ( ) 信誉:100 2003-03-17 09:31:00 得分:0


#include <iostream.h>
int &f(int i)
{
int &j=i;
return j;
/*形参等同局部变量,在作用域之外无效。*/
}

你没有注意到j只是i的引用,i是调用函数传进来的
WeltactXp 2003-03-17
  • 打赏
  • 举报
回复
void main(void)
{
int &x=f(10);
cout<<"\n"<<x; //在此处x还是10
cout<<"\n"<<x<<"\n"<<x << "\n"; //***********
cout<<x<<"\n"<<x; //在此处x还是10
}

倒数第二个最后再加一个\n,输出为10,!10, !10, !10
汤姆斯旺的code secret有关于流的介绍,endl或flush是肯定马上清除流缓冲的,但"\n"是不是马上清除呢,依据这个例子,我想,只有"\n"放在cout语句的最末的时候才会清除掉流缓冲
JoshuaLi 2003-03-17
  • 打赏
  • 举报
回复
#include <iostream.h>
int &f(int i)
{
int &j=i;
return j;
/*形参等同局部变量,在作用域之外无效。*/
}

void main(void)
{
int &x=f(10), x1=x;
cout<<"x="<<x<<",x1="<<x1<<"\n";
/* x1与形参相等可能是优化的结果,不知在不同环境会如何 */

int iTmp = 111;
int &x_2 = f(iTmp), x1_2=x_2;
cout<<"x_2="<<x_2<<",x1_2="<<x1_2<<"\n";
}
Chrisma 2003-03-17
  • 打赏
  • 举报
回复
#include <iostream.h>
int &f(int i)
{
int &j=i;
return j;
}
void main(void)
{
int &x=f(10);
cout<<"\n"<<x; //在此处x还是10
cout<<"\n"<<x<<"\n"<<x; //在此处x还是10
cout<<x<<"\n"<<x; //在此处x还是10
}
用"\n"夹x输出还是10,看来不是临时变量若的货,如你所说,thinking in C++这样说的
话,thinking in C++就是错误的。此程序似乎没必要产生临时变量。
WeltactXp 2003-03-17
  • 打赏
  • 举报
回复
没啦,我就只发现这些了呵

纠正一下,C++是不自动回收new出来的内存
Chrisma 2003-03-17
  • 打赏
  • 举报
回复
也是,奇怪啊
加载更多回复(18)
LINGO是用来求解线性和非线性优化问题的简易工具。LINGO内置了一种建立最优化模型的语言,可以简便地表达大规模问题,利用LINGO高效的求解器可快速求解并分析结果。 §1 LINGO快速入门 当你在windows下开始运行LINGO系统时,会得到类似下面的一个窗口: 外层是主框架窗口,包含了所有菜单命令和工具条,其它所有的窗口将被包含在主窗口之下。在主窗口内的标题为LINGO Model – LINGO1的窗口是LINGO的默认模型窗口,建立的模型都都要在该窗口内编码实现。下面举两个例子。 例1.1 如何在LINGO中求解如下的LP问题: 在模型窗口中输入如下代码: min=2*x1+3*x2; x1+x2>=350; x1>=100; 2*x1+x2<=600; 然后点击工具条上的按钮 即可。 例1.2 使用LINGO软件计算6个发点8个收点的最小费用运输问题。产销单位运价如下表。 单 位 销地 运 价 产地 B1 B2 B3 B4 B5 B6 B7 B8 产量 A1 6 2 6 7 4 2 5 9 60 A2 4 9 5 3 8 5 8 2 55 A3 5 2 1 9 7 4 3 3 51 A4 7 6 7 3 9 2 7 1 43 A5 2 3 9 5 7 2 6 5 41 A6 5 5 2 2 8 1 4 3 52 销量 35 37 22 32 41 32 43 38 使用LINGO软件,编制程序如下: model: !6发点8收点运输问题; sets: warehouses/wh1..wh6/: capacity; vendors/v1..v8/: demand; links(warehouses,vendors): cost, volume; endsets !目标函数; min=@sum(links: cost*volume); !需求约束; @for(vendors(J): @sum(warehouses(I): volume(I,J))=demand(J)); !产量约束; @for(warehouses(I): @sum(vendors(J): volume(I,J))<=capacity(I)); !这里是数据; data: capacity=60 55 51 43 41 52; demand=35 37 22 32 41 32 43 38; cost=6 2 6 7 4 2 9 5 4 9 5 3 8 5 8 2 5 2 1 9 7 4 3 3 7 6 7 3 9 2 7 1 2 3 9 5 7 2 6 5 5 5 2 2 8 1 4 3; enddata end 然后点击工具条上的按钮 即可。 为了能够使用LINGO的强大功能,接着第二节的学习吧。 §2 LINGO中的集 对实际问题建模的时候,总会遇到一群或多群相联系的对象,比如工厂、消费者群体、交通工具和雇工等等。LINGO允许把这些相联系的对象聚合成集(sets)。一旦把对象聚合成集,就可以利用集来最大限度的发挥LINGO建模语言的优势。 现在我们将深入介绍如何创建集,并用数据初始化集的属性。学完本节后,你对基于建模技术的集如何引入模型会有一个基本的理解。 2.1 为什么使用集 集是LINGO建模语言的基础,是程序设计最强有力的基本构件。借助于集,能够用一个单一的、长的、简明的复合公式表示一系列相似的约束,从而可以快速方便地表达规模较大的模型。 2.2 什么是集 集是一群相联系的对象,这些对象也称为集的成员。一个集可能是一系列产品、卡车或雇员。每个集成员可能有一个或多个与之有关联的特征,我们把这些特征称为属性。属性值可以预先给定,也可以是未知的,有待于LINGO求解。例如,产品集中的每个产品可以有一个价格属性;卡车集中的每辆卡车可以有一个牵引力属性;雇员集中的每位雇员可以有一个薪水属性,也可以有一个生日属性等等。 LINGO有两种类型的集:原始集(primitive set)和派生集(derived set)。 一个原始集是由一些最基本的对象组成的。 一个派生集是用一个或多个其它集来定义的,也就是说,它的成员来自于其它已存在的集。 2.3 模型的集部分 集部分是LINGO模型的一个可选部分。在LINGO模型中使用集之前,必须在集部分事先定义。集部分以关键字“sets:”开始,以“endsets”结束。一个模型可以没有集部分,或有一个简单的集部分,或有多个集部分。一个集部分可以放置于模型的任何地方,但是一个集及其属性

69,381

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧