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

我想一开始得模仿一下别人的编译器吧,所以得弄明白一门程序的本质!


/images/2011/147787/2011051411021524.jpg" border="0" />
2007-06-16 16:01
野比
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:24
帖 子:1627
专家分:516
注 册:2007-5-24
得分:0 
回复:(ioriliao)我想一开始得模仿一下别人的编译器...

哦.. 也不失为一种方法
送你一份简单词法分析源代码作为参考. 应该对你写编译器有帮助..

2r1XXy2s.zip (7.72 KB) [求助]++a++与(++a)++



女侠,约吗?
2007-06-16 16:16
ioriliao
Rank: 7Rank: 7Rank: 7
来 自:广东
等 级:贵宾
威 望:32
帖 子:2829
专家分:647
注 册:2006-11-30
得分:0 
非常感谢你!

/images/2011/147787/2011051411021524.jpg" border="0" />
2007-06-16 16:51
I喜欢c
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:64
帖 子:1749
专家分:0
注 册:2007-3-2
得分:0 
以下是引用ioriliao在2007-6-16 13:11:17的发言:
呵呵,要写一个编译器的能力我还差很远很远,但我的目标是这样的!
你的目标是什么呢?

哎.. 没有目标..

我也不是干这行的..

个人爱好,写这耍..呵呵


 我是指针,却丢失了目标地址!          我是循环,却缺少了结束条件!      我是函数,却没有人来调用!   
2007-06-16 16:54
aipb2007
Rank: 8Rank: 8
来 自:CQU
等 级:贵宾
威 望:40
帖 子:2879
专家分:7
注 册:2007-3-18
得分:0 
以下是引用HJin在2007-6-15 13:36:29的发言:

have your ever overloaded the ++ and -- (totally 4 operators) for a class, say A? If you did this, then you understand what I said.

Try to do the following exercise:

[CODE]class A
{
// overload ++(two versions)

private:
int d;
double d;
};[/CODE]

your declaration for the postfix ++ must be

[CODE]const A operator++(int); /// postfix [/CODE]

(here we used a dummy int argument to mark it as the postfix version, otherwise, you cannot
make it different from the prefix version. )

for the prefix version must be
[CODE]A& operator++() /// prefix[/CODE]

All other variants are wrong. You may ask me why this has to be so? I would have to tell you, the writers for the compliers, both MS C++ and g++, implemented it so.

/**
This is an option for the postfix ++. But since it returns void,
we cannot use it in an expression, say (a++) + 1.
*/
//void operator++(int)
//{
// ++(*this);
//}


看了下你的解释,我想说点看法:

首先,我不明白你为什么把后自增的返回值认为是一个常量?你在说明++重载的时候
const A operator++(int);
我也写过++重载,但是我从来都
A& operator++();
A operator++(int);
所以,我认为问题关键不在这里,并且由此又引出一个问题,内置类型和类类型对++的理解。
想起以前一个帖子:(yuyunliuhen 斑竹连接出来那个)

在那个问题里,大家都说清楚了前自增,后自增的区别。
前自增返回变量本身,后自增返回临时变量。
但是我想即使是临时变量,也应该可以取地址的啊。
比如 int b = a++;
然后 &b 是允许的吧!
所以这点并不足以解释。如果用HJun的返回常量理论,也一样有这个问题。

我用类重载++时,
++a++ //== ++(a++)这样用是可以的。


所以我觉得,内置类型中++的实现不同与类类型中++重载。
至于,再深一步的,就看大家了!

ps:不对的请指教,刚才写段小代码突然想到了。

[此贴子已经被作者于2007-6-16 16:59:41编辑过]


Fight  to win  or  die...
2007-06-16 16:58
ioriliao
Rank: 7Rank: 7Rank: 7
来 自:广东
等 级:贵宾
威 望:32
帖 子:2829
专家分:647
注 册:2006-11-30
得分:0 
以下是引用I喜欢c在2007-6-16 16:54:00的发言:

哎.. 没有目标..

我也不是干这行的..

个人爱好,写这耍..呵呵

我觉得你有一种怀才不遇的感慨!


/images/2011/147787/2011051411021524.jpg" border="0" />
2007-06-16 17:29
ioriliao
Rank: 7Rank: 7Rank: 7
来 自:广东
等 级:贵宾
威 望:32
帖 子:2829
专家分:647
注 册:2006-11-30
得分:0 

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

++a拆开来等价于什么?


/images/2011/147787/2011051411021524.jpg" border="0" />
2007-06-16 18:00
yp456
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2007-6-6
得分:0 
15楼的观点强烈支持,实用点吧~~~难道自己写程序也这么用?存心锻炼自己的思维能力?

[此贴子已经被作者于2007-6-16 18:30:42编辑过]


2007-06-16 18:30
ioriliao
Rank: 7Rank: 7Rank: 7
来 自:广东
等 级:贵宾
威 望:32
帖 子:2829
专家分:647
注 册:2006-11-30
得分:0 
以下是引用yp456在2007-6-16 18:30:21的发言:
15楼的观点强烈支持,实用点吧~~~难道自己写程序也这么用?存心锻炼自己的思维能力?

我知道你所谓实用点.不外是写写erp如此之类的.如果所谓实用点,我根本用不着来学习C++,我去学.net就行了.
我已经说得很明白了,我想知道的是一些本质的东西.当你在用一个按钮时,可曾想过
这个按钮是怎么来的.你又何曾想过.net是如何来的.C++又是如何来的.我就是不想知其然,不知其所以然.
或者我只能对你说,道不同不相为谋.


/images/2011/147787/2011051411021524.jpg" border="0" />
2007-06-16 18:56
I喜欢c
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:64
帖 子:1749
专家分:0
注 册:2007-3-2
得分:0 
以下是引用ioriliao在2007-6-16 17:29:27的发言:

我觉得你有一种怀才不遇的感慨!

哎.. 有那本事就好了..

菜鸟一只...


 我是指针,却丢失了目标地址!          我是循环,却缺少了结束条件!      我是函数,却没有人来调用!   
2007-06-17 10:29



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




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

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