| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1614 人关注过本帖
标题:[讨论][求助]关于后置自增操作符的问题
只看楼主 加入收藏
panxiang88
Rank: 1
等 级:新手上路
帖 子:33
专家分:0
注 册:2007-7-21
收藏
 问题点数:0 回复次数:11 
[讨论][求助]关于后置自增操作符的问题
int i = 5;
i = 6*(i++);

我理解是这样的:i自增后为6,i++返回5,并且6*5被赋给i,覆盖原值,那么i应该为30,为什么我在vc++上执行后是31?
搜索更多相关主题的帖子: 操作符 后置 原值 
2007-08-01 14:15
medicihophy
Rank: 1
等 级:新手上路
威 望:1
帖 子:102
专家分:0
注 册:2007-7-28
收藏
得分:0 
没有问题啊,请首先查运算符的优先性
=在++后面,所以是先i=5先进行*操作得30,然后和=比,++在先,所以+1使得i=31自然结果是31了
你可以测试下面两种情况自然明白了:
第一种:
int i=5;
i=6*(i++);
cout<<i;
第二种:
int i=5;
cout<<6*(i++);
可以知道,第二种结果即是30;


要明白,=也是运算符。的确6*(i++)的值是30,但i=6*(i++),不代表i=30,等号只是我们这么说而已,准确应该叫
赋值操作。

2007-08-01 14:37
medicihophy
Rank: 1
等 级:新手上路
威 望:1
帖 子:102
专家分:0
注 册:2007-7-28
收藏
得分:0 
忘了说了,*和++是同一优先级的,所以先左后右进行运算。

[此贴子已经被作者于2007-8-1 14:41:22编辑过]



2007-08-01 14:40
medicihophy
Rank: 1
等 级:新手上路
威 望:1
帖 子:102
专家分:0
注 册:2007-7-28
收藏
得分:0 
而且,通常这种运算顺序与计算机硬件,和语言都有关系,所以知道就好,不要刻意去刁钻。
例如,你知道这个计算的值是多少吗?
++i++

2007-08-01 14:43
panxiang88
Rank: 1
等 级:新手上路
帖 子:33
专家分:0
注 册:2007-7-21
收藏
得分:0 
我看书上说后置++的工作原理是先将i原值保存,然后执行++i,此时i为6,最后再返回i的原值,即5,此时的5是个右值。这时候(i++)已经执行完了,接着再执行*和=,即将30赋给i,i被赋值前是6.
同样,++(i++),应该不能通过编译吧?因为i++返回的是右值
这是我理解的,你觉着呢?
2007-08-01 15:03
medicihophy
Rank: 1
等 级:新手上路
威 望:1
帖 子:102
专家分:0
注 册:2007-7-28
收藏
得分:0 

为什么(++i)++能编译,而++(i++)不能编译呢?这是由环境决定的吧。
同时,
我也发觉我讲的的确不对,不过从例子看来的确有不同,我再找找看!


2007-08-01 16:22
medicihophy
Rank: 1
等 级:新手上路
威 望:1
帖 子:102
专家分:0
注 册:2007-7-28
收藏
得分:0 
有点明白了,这还是编译环境的问题:
例如:
int i=5;
i=i++;
cout<<i;
则输出6.
int i=5;
i=(i++);
cout<<i;
则还是输出6.
则说明这个括号是多余的,可以去掉,然后就好理解了,
i=5,将5赋值给i,则i还是5,然后再++,自然就为6了。
所以:
int i=5;
i=6*(i++);
等效与i=6*i++;
所以说,后置++是个胆小鬼,连同类都怕!!!!!

2007-08-01 16:42
medicihophy
Rank: 1
等 级:新手上路
威 望:1
帖 子:102
专家分:0
注 册:2007-7-28
收藏
得分:0 
我们现在可以这么做了,在VC中完全没必要出现什么(i++)了,直接可以去掉括号!
这也就是(++i)++能编译,而++(i++)不能编译的原因了,并不是加了个括号就一定有作用,去掉之后不还是++i++吗

[此贴子已经被作者于2007-8-1 16:52:50编辑过]


2007-08-01 16:45
panxiang88
Rank: 1
等 级:新手上路
帖 子:33
专家分:0
注 册:2007-7-21
收藏
得分:0 
++i++是右结合,所以++i++就是++(i++),而i++返回一个右值,就是const类型的临时变量,是不能修改的,此时若++这个const临时变量是不能编译通过的。
而(++i)++就不一样了,++i返回的就是加过一后的i,就是说返回的是变量,此时再++是可以的;
总之,关键点就是i++执行后,返回的不是i!而是一个const,这个const再参与后面的运算;而++i返回的就是改变后的自身。
2007-08-01 20:51
medicihophy
Rank: 1
等 级:新手上路
威 望:1
帖 子:102
专家分:0
注 册:2007-7-28
收藏
得分:0 
你见到(i++)把他括号去掉就对了,钻牛角是用在哲学上的,这里是经验之谈而已

2007-08-01 20:54
快速回复:[讨论][求助]关于后置自增操作符的问题
数据加载中...
 
   



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

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