社区
C语言
帖子详情
谁能回答:为什么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";
}
...全文
57
38
打赏
收藏
谁能回答:为什么x1=x,但输出结果不相等?
#include int &f(int i) { int &j=i; return j; } void main(void) { int &x=f(10), x1=x; cout<<"x="<<x<<",x1="<<x1<<"\n"; }
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)
手写数字识别系统.doc【GUI设计Matlab】
资 源 简 介 手写数字识别系统,非常好的啊!带有GUI界面,使用方便! 详 情 说 明 用这个手写数字识别系统,你可以轻松地识别手写数字。这个系统不仅功能强大,而且还带有直观的图形用户界面(GUI),非常容易使用。你只需要将手写数字输入系统,它将立即给出准确的识别结果。这个系统可以在各种场景中使用,无论是学校、工作还是日常生活,都能为你提供快速和准确的识别服务。它是一个非常方便和实用的工具,你一定会喜欢它的!
如何通过区域科技创新分析工具精准掌握区域创新要素分布与产业链融合现状?.docx
如何通过区域科技创新分析工具精准掌握区域创新要素分布与产业链融合现状?
Visual-Workflow-Orphan-Node-Auditor-v1.0-原创源码与文档.zip
原创本地工程审计与分析工具合集中的独立资源包。每个ZIP包含完整源码、3项自动化测试、可复现合成示例、离线HTML、JSON与SVG报告、1080×720真实运行效果图、README、运行说明、功能清单、MIT License及原创与授权声明。解压后进入project目录,执行npm test验证算法,执行npm run report生成报告,也可通过本地静态服务器打开网页。运行时零第三方依赖,不包含热点产品或开源项目源码、Logo、官方截图、论文、生产日志或其他受限素材。适合前端开发、AI应用工程、测试审计和课程实践。
Cypress-Flaky-Test-Evidence-Auditor-v1.0-原创源码与文档.zip
原创本地工程审计与分析工具合集中的独立资源包。每个ZIP包含完整源码、3项自动化测试、可复现合成示例、离线HTML、JSON与SVG报告、1080×720真实运行效果图、README、运行说明、功能清单、MIT License及原创与授权声明。解压后进入project目录,执行npm test验证算法,执行npm run report生成报告,也可通过本地静态服务器打开网页。运行时零第三方依赖,不包含热点产品或开源项目源码、Logo、官方截图、论文、生产日志或其他受限素材。适合前端开发、AI应用工程、测试审计和课程实践。
FortiGate-v7.4.9-FGT-601E-v7.4.9.M-build2829-FORTINET.out
FGT_601E-v7.4.9.M-build2829-FORTINET.out
C语言
70,038
社区成员
243,245
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章