标题:[求助]++a++与(++a)++
只看楼主
ioriliao
Rank: 7Rank: 7Rank: 7
来 自:广东
等 级:贵宾
威 望:32
帖 子:2829
专家分:647
注 册:2006-11-30
得分:0 

呵呵,,又引申出问题了!


/images/2011/147787/2011051411021524.jpg" border="0" />
2007-06-17 12:51
jiaju111
Rank: 1
等 级:新手上路
帖 子:94
专家分:0
注 册:2007-3-27
得分:0 

支持楼主的学习方法

我也是这么学的

要学就学精


Everything is gonna be okay!
2007-06-17 22:35
百年不亮
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:789
专家分:0
注 册:2006-4-14
得分:0 
好吧,现在讨论aipb2007 的问题

我认为这不是什么返回常量的问题,也没见哪本书说返回常量,再说即使是常量也可以取地址操作,比如:
[CODE]char *p_str="hello";
const int a;
int *p_int=&a;[/CODE]
这里"hello"和a都是常量,也允许取地址.所以还是我说的返回临时变量问题.

至于为什么返回的临时变量不能取地址操作,这是因为临时变量在返回后就不再需要了,所以编译器在实现时可能将临时变量放在堆栈寄存器中(对于一个int型变量编译器有足够的理由放到EAX这样的通用寄存器中),临时变量在返回后编译器会加入代码销毁临时变量,调用临时对象的destructor,如果允许程序用指针指过去,销毁后再用指针访问这段内存很可能出错,如果临时变量在寄存器中就更加不可能让程序员取地址操作了.综上所述,c++不能让程序员对临时变量取地址.

[此贴子已经被作者于2007-6-17 23:54:31编辑过]

2007-06-17 23:52
aipb2007
Rank: 8Rank: 8
来 自:CQU
等 级:贵宾
威 望:40
帖 子:2879
专家分:7
注 册:2007-3-18
得分:0 
回复:(百年不亮)好吧,现在讨论aipb2007 的问题我认...

谢谢!还有点疑惑,就算是临时变量,那怎么又可以进行解引用操作呢?

并且我发先,产生错误的操作是因为程序想修改a++返回的值,比如我可以 (a++)+1,*a++,这些都是允许的。
以你的说法,好象有点矛盾,也不知道是不是我理解错你意思了。
还有,你说“如果允许程序用指针指过去,销毁后再用指针访问这段内存很可能出错”
但是
int a[] = {10,100};
int *pi = a;
int *pi2 = pi++;
cout << &pi2 << endl;

没有错误。说明pi2可以保存pi++返回的临时值啊!
顺便,请教一下,这个 临时变量 怎么用代码实现,我们写函数可以有这样的返回吗?


我也想一次弄清楚,麻烦你耐心点哦!
呵呵呵~


Fight  to win  or  die...
2007-06-18 09:24
yuyunliuhen
Rank: 6Rank: 6
等 级:贵宾
威 望:20
帖 子:1435
专家分:0
注 册:2005-12-12
得分:0 
回复:(百年不亮)好吧,现在讨论aipb2007 的问题我认...
返回值可以是常量,
当返回值为临时变量的时候,临时变量会自动定为常量------------《thinking in C++》
http://bbs.bc-cn.net/viewthread.php?tid=140728
上次说到重载的时候,我们一般会选择让前缀版本的返回值为非常量的,而后缀版本为常量的

Go confidently in the  directions of your dreams,live the life you have imagined!Just do it!
It is no use learning without thinking!
2007-06-18 10:31
aipb2007
Rank: 8Rank: 8
来 自:CQU
等 级:贵宾
威 望:40
帖 子:2879
专家分:7
注 册:2007-3-18
得分:0 
还是没解决问题!

Fight  to win  or  die...
2007-06-18 14:07
百年不亮
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:789
专家分:0
注 册:2006-4-14
得分:0 
以下是引用aipb2007在2007-6-18 9:24:46的发言:

谢谢!还有点疑惑,就算是临时变量,那怎么又可以进行解引用操作呢?

并且我发先,产生错误的操作是因为程序想修改a++返回的值,比如我可以 (a++)+1,*a++,这些都是允许的。
以你的说法,好象有点矛盾,也不知道是不是我理解错你意思了。
还有,你说“如果允许程序用指针指过去,销毁后再用指针访问这段内存很可能出错”
但是
int a[] = {10,100};
int *pi = a;
int *pi2 = pi++;
cout << &pi2 << endl;

没有错误。说明pi2可以保存pi++返回的临时值啊!
顺便,请教一下,这个 临时变量 怎么用代码实现,我们写函数可以有这样的返回吗?


我也想一次弄清楚,麻烦你耐心点哦!
呵呵呵~

这里的pi++返回了一个临时对象,但是pi2=pi++只是接受了临时变量的值,并没有用指针指向临时变量.你要注意这里哪个是临时变量.我强调的是不能用指针指向临时对象,而接受临时对象的值完全是正常操作.你举的例子是接受临时对象的值.

还是43楼我说的临时对象在返回之后会编译器会调用destructor销毁临时变量,所以不能取临时变量地址.
我觉得你还是没有明白接受了临时变量的值 取临时变量地址 的区别,临时变量名字中临时的就是它的生命周期短,在返回后就结束了,你还要看清楚什么时候创建,什么时候结束这个问题.

2007-06-18 14:56



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-147663-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.345177 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved