引用相关

jinchats 2010-08-20 08:38:15

#include<iostream>
using namespace std;
int change(int& ii);

int main()
{
int i=1;

cout<<change(i)<<endl<<i<<endl; //1
cout<<i<<endl; //2
}

int change(int& ii) //ii 是通过引用传入
{
ii = 2;
return 0;
}

在main函数里,1 和 2 处的结果为何不相同 ???
该程序是在linux下用g++编译的
...全文
139 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiedejun1984 2010-08-21
  • 打赏
  • 举报
回复
int i = 0;
cout<< i++ << endl << i++ << endl;
输出
1
0
结论:
operator<< 是右结合
haogeai123 2010-08-21
  • 打赏
  • 举报
回复
<<是从右往左执行的啊,
cout<<change(i)<<endl<<i<<endl; //1 
//是先输出i,再执行change(i)函数的啊
arong1234 2010-08-21
  • 打赏
  • 举报
回复
没有意义的,虽然逻辑上运算顺序是从左到右,但是表达式i的值不一定等change执行完才计算.实际上,他完全可以在这行表达式开始的时候被push进stack,然后在用到的时候再被pop出来.在绝大多数情况下,这都是正确的优化,而对这种不好的代码风格下,恰恰错了.[Quote=引用 13 楼 cbib_cat 的回复:]
同意上面说法,参数压栈的顺序应该是从右到左。

引用 11 楼 cyblueboy83 的回复:

0,1,2 有啥问题吗?
[/Quote]
cbib_cat 2010-08-21
  • 打赏
  • 举报
回复
同意上面说法,参数压栈的顺序应该是从右到左。[Quote=引用 11 楼 cyblueboy83 的回复:]

0,1,2 有啥问题吗?
[/Quote]
jinchats 2010-08-21
  • 打赏
  • 举报
回复
嗯, 谢谢各位了。谢谢!!!
jinchats 2010-08-21
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 cyblueboy83 的回复:]
0,1,2 有啥问题吗?
[/Quote]

有啊?为什么change(i) 后面打出的 i 跟下一行打出的 i 不一样呢??
herman~~ 2010-08-20
  • 打赏
  • 举报
回复
0,1,2 有啥问题吗?
hjbxyz 2010-08-20
  • 打赏
  • 举报
回复
不好意思,错了,是
0
1
2
编译器优化的结果
hjbxyz 2010-08-20
  • 打赏
  • 举报
回复
0
2
2
libinfei8848 2010-08-20
  • 打赏
  • 举报
回复
关掉编译器优化试试
或者你直接去看asm
liutengfeigo 2010-08-20
  • 打赏
  • 举报
回复
只可以说行为未定义?
arong1234 2010-08-20
  • 打赏
  • 举报
回复
volatile对性能是有影响的吧,因为他禁止了所有对这个变量的优化!对于楼主这种情况,他根本不应该写带副作用的表达式,不要因为一种有瑕疵的编码习惯,来使用一种这种降低性能的"解决"方案[Quote=引用 5 楼 pengzhixi 的回复:]
加个volatile试试。
[/Quote]
pengzhixi 2010-08-20
  • 打赏
  • 举报
回复
加个volatile试试。
arong1234 2010-08-20
  • 打赏
  • 举报
回复
这个结果是不可预期的,是因为你不知道1处第二个i在什么时候求值.直观上看,这个i在change(i)之后求值,因此应该是2,但是,由于i在表达式中出现了两次,为了最快得到i,在优化的情况下,系统完全可以先把i的值保存起来,在你计算完之后,直接得到保存好的值,所以他此时实际不是从i这个变量这边导入的.
arong1234 2010-08-20
  • 打赏
  • 举报
回复
不要在一个表达式中使用任何影响表达式另外一部分值的代码,有些时候结果是不可预期的
jinchats 2010-08-20
  • 打赏
  • 举报
回复
我预想也是相同的, 可是结果就是不同

//1 处打出的 i 是1
//2 处打出的 i 是2
liutengfeigo 2010-08-20
  • 打赏
  • 举报
回复
i的值是相同的吧。

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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