| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2343 人关注过本帖
标题:[求助]++a++与(++a)++
只看楼主 加入收藏
I喜欢c
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:64
帖 子:1749
专家分:0
注 册:2007-3-2
收藏
得分:0 
以下是引用ioriliao在2007-6-16 18:00:00的发言:

a++是否等价于a=a+1
我写了一段代码
int a=10;
int* p;
p=&(a=a+1); //这是返回变量 ,可为什么a++就返回常量呢?编译器究竟是怎么样拆开来的?
这样编译通过
如果两者等价可为什么
p=&(a++) //就不行

++a拆开来等价于什么? 我认为++a 才等价与a=a+1;


 我是指针,却丢失了目标地址!          我是循环,却缺少了结束条件!      我是函数,却没有人来调用!   
2007-06-17 10:31
I喜欢c
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:64
帖 子:1749
专家分:0
注 册:2007-3-2
收藏
得分:0 

按照前面所说:

a++返回的是常量,那么 &(常量)就是一个错误的操作,所以答案就很明确了..
不知道 ioriliao 这下清楚了没?


 我是指针,却丢失了目标地址!          我是循环,却缺少了结束条件!      我是函数,却没有人来调用!   
2007-06-17 10:39
ioriliao
Rank: 7Rank: 7Rank: 7
来 自:广东
等 级:贵宾
威 望:32
帖 子:2829
专家分:647
注 册:2006-11-30
收藏
得分:0 

我知道这是返回常量,我却不明白为何会返回常量,而++a却不是!


/images/2011/147787/2011051411021524.jpg" border="0" />
2007-06-17 11:35
百年不亮
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:789
专家分:0
注 册:2006-4-14
收藏
得分:0 

yuyunliuhen 在6楼的回复中给出了我以前的帖子的地址,估计楼主根本没看.


我以前写了个帖子讨论C++内置类型的++前缀和后缀.我想自定义的对象++前缀和后缀很明确,大家都知道,谈论内置类型的却不多.在C++中内置类型++前缀返回原始变量,后缀返回临时变量,C++不允许对临时变量进行操作,因为有的编译器在实现临时变量时使用寄存器变量,显然对寄存器变量取地址是非法的.C和C++在这个问题上有一个区别,在C中++前缀也是rvalue,使用&(++a)会提示&需要一个lvalue.

下面我把之前哪个帖子贴过来:
http://bbs.bc-cn.net/viewthread.php?tid=140728


[QUOTE]
之前的一个帖子中提到关于自增前缀和后缀的问题,帖子在这里:http://bbs.bc-cn.net/dispbbs.asp?boardid=56&replyid=58792&id=124908&page=20&skin=0&star=1
int main()
{
int x=5;
int *p=&++x;
int *q=&x++; //error C2102: '&' requires l-value
return 0;
}

Cpp1.cpp
C:\Documents and Settings\Administrator\桌面\daima\Cpp1.cpp(6) : error C2102: '&' requires l-value


最后大家争论的焦点就在为什么&++x合法,而&x++会出错,有人提到我们在c++中重载前缀自增时直接将原始对象加一,最后返回原始对象的引用,所以&++x取的是原始对象的地址,是合法的。而在后缀的实现中是通过将原始对象的值赋给一个临时对象,再将原始对象加一,最后返回临时对象的值,&x++就是取一个临时对象的地址,所以是错误的操作。我看后觉得这是有道理的,但是这只是推测,不敢确定c/c++中内置类型也是这样实现的,近来翻看Bjarne Stroustrup 的 <<The C++ Programming Language>>,发现有一段话如下:

6.2.5 Increment and Decrement
The ++ operator is used to express incrementing directly,rather than expressing it indirectly using a combination of an addition and an assignment. By definition, ++lvaue means lvalue+=1, which again means lvalue=lvalue+1 provided lvalue has no side effects. The expression denoting the object to be incremented is evalued once(ovly). Decrementint is similarly expressed by the -- operator. The operators ++ and -- can be used as both prefix and postfix operators.The value of ++x is the new(that is, incremented)value of x. For example, y=++x is equivalent to y=(x+=1). The value of x++, however, is the old value of x. For example, y=x++ is equivalent to y=(t=x,x+=1,t), where t is a variable of the same type as x.

最后两句话就是我关心的:x++的值是x自增之前的旧值。例如y=x++相当于y=(t=x,x+=1,t),其中t是和x相同类型的变量

对比y=++x is equivalent to y=(x+=1) 和 y=x++ is equivalent to y=(t=x,x+=1,t),可以看出前缀和后缀的本质差别,&++x等价于&(x+=1)即(x+=1,&x); &x++等价于&(t=x,x+=1,t)即&t.

有了Bjarne Stroustrup他老人家的话自己终于放心了。
[/QUOTE]
2007-06-17 11:48
ioriliao
Rank: 7Rank: 7Rank: 7
来 自:广东
等 级:贵宾
威 望:32
帖 子:2829
专家分:647
注 册:2006-11-30
收藏
得分:0 
首先我要说声谢谢!
其实我是看了的,只
是心中还是有疑惑 :

&t 和是常量还是变量?
&t 何以见得会错误?

/images/2011/147787/2011051411021524.jpg" border="0" />
2007-06-17 11:53
I喜欢c
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:64
帖 子:1749
专家分:0
注 册:2007-3-2
收藏
得分:0 
这的 t 只是寄存器中一个临时变量(我认为) 所以.....

其实不应该是t,而就是一空间,这只是为了说明这个问题才引用 t 说法吧...

[此贴子已经被作者于2007-6-17 12:00:22编辑过]


 我是指针,却丢失了目标地址!          我是循环,却缺少了结束条件!      我是函数,却没有人来调用!   
2007-06-17 11:58
ioriliao
Rank: 7Rank: 7Rank: 7
来 自:广东
等 级:贵宾
威 望:32
帖 子:2829
专家分:647
注 册:2006-11-30
收藏
得分:0 

这的 t 只是寄存器中一个临时变量
变量不是可以 &t的么,只是常量不行,
这里好像有矛盾,我就是因为这而迷惑了.


/images/2011/147787/2011051411021524.jpg" border="0" />
2007-06-17 12:06
百年不亮
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:789
专家分:0
注 册:2006-4-14
收藏
得分:0 
[QUOTE]我以前写了个帖子讨论C++内置类型的++前缀和后缀.我想自定义的对象++前缀和后缀很明确,大家都知道,谈论内置类型的却不多.在C++中内置类型++前缀返回原始变量,后缀返回临时变量,C++不允许对临时变量进行操作,因为有的编译器在实现临时变量时使用寄存器变量,显然对寄存器变量取地址是非法的.C和C++在这个问题上有一个区别,在C中++前缀也是rvalue,使用&(++a)会提示&需要一个lvalue.
[/QUOTE]

你这次可能没有看我的第一段文字,注意我红色部分.

你自己写个测试的短程序,用不同的编译器编译后看看汇编代码,找到临时变量的实现指令.你既然有自己写编译器的志向就应该研究汇编代码,这里没有任何迷雾,真相就摆在你面前.汇编之后了无秘密.
2007-06-17 12:06
ioriliao
Rank: 7Rank: 7Rank: 7
来 自:广东
等 级:贵宾
威 望:32
帖 子:2829
专家分:647
注 册:2006-11-30
收藏
得分:0 

那么如果我研究C++本身的问题就得连汇编一起上了.谢谢!


/images/2011/147787/2011051411021524.jpg" border="0" />
2007-06-17 12:11
aipb2007
Rank: 8Rank: 8
来 自:CQU
等 级:贵宾
威 望:40
帖 子:2879
专家分:7
注 册:2007-3-18
收藏
得分:0 


你们有的说c++返回常量,有的说返回临时变量,到底是哪个?

还有,看看我的问题好不?25楼!

谢谢!

Fight  to win  or  die...
2007-06-17 12:45
快速回复:[求助]++a++与(++a)++
数据加载中...
 
   



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

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