| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1057 人关注过本帖
标题:被a++和++a搞晕乎乎的童鞋们可以进来下啊~哈哈,顶顶~
只看楼主 加入收藏
xinyukkkk028
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2011-5-10
收藏
 问题点数:0 回复次数:14 
被a++和++a搞晕乎乎的童鞋们可以进来下啊~哈哈,顶顶~
之前很多朋友都问了我这个问题,处于方便,我就一次这个帖子解答了吧。。。其实很简单,因为每一个表达式都有一个返回值。
比如c++或者++c。这些都是一个表达式,而自增(或者自减)运算符的位置的不同,表达式的返回类型就不同。
前置的运算符返回的是对该对象的一个引用。就是说,返回的是一个地址,所以可以做连续运算,比如++++c这样的表达式是合法的。
但是后置运算法不一样。他返回的只是一个临时副本,就是说,返回的只是一个值而并没有一个修改权限(可以把它理解成为一个constant的值)
所以说c++++这样的表达式是不合法的,一般用的gcc或者vc编译器都会报错的吧。而且准确的说,后置运算符++是一个二元运算符。第一个参数是你做操作的对象本身,第二个参数实际上是编译器自动传入的一个int,而且这个值一般为0。就是说c++这个表达式的完整形式应该是 operator ++(int c,int),第二个参数实际上没有什么用处,只是为了和前置运算符区分以便重载而已。
总之,明白了前置返回的是引用而后置返回的是值的话,其实很好理解了。
这就是为什么a=(++c)+(++c);c=0;最后的a=4而不是3或者2或者别的什么答案了。你们明白咯吗
搜索更多相关主题的帖子: 表达式 朋友 
2011-05-11 00:28
xinyukkkk028
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2011-5-10
收藏
得分:0 
木有人顶啊,木有人回帖啊。。。感觉白打字了啊
2011-05-11 00:32
donggegege
Rank: 5Rank: 5
等 级:职业侠客
威 望:1
帖 子:125
专家分:368
注 册:2011-5-1
收藏
得分:0 
a++与++a的区别在于,a++是先进行赋值,然后进行加1.而++a则事先进行加1运算,然后进行赋值操作。
2011-05-11 12:54
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9024
专家分:54030
注 册:2011-1-18
收藏
得分:0 
T& operator++ ()
{
    t += 1;
    return t;
}

const T& operator++( int )
{
    T temp = t;
    t += 1;
    return temp;
}
收到的鲜花
2011-05-11 12:55
Demon_JIE
Rank: 2
来 自:成都 西华大学
等 级:论坛游民
帖 子:26
专家分:39
注 册:2011-4-27
收藏
得分:0 
在循环当中有时候 都没怎么区分这个
for(i = 1; i <= n; i++ or ++i)
都一样
2011-05-11 20:25
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
感觉楼主说的好多都不对呀……

比如 c++++ 这种,按传统的观念解释应该是左右值的问题。不是什么二元运算符的事。
后置++ 的重载应该算是一类特殊的语法,具体编译器如何实现,应该是没做规定。不是说一定要传个 int 参数过去。

还有你真的试过:
a=(++c)+(++c)
在 c=0 的时候值是 4 吗。
我觉得不一定。不过我没试。


不过看了楼主的这个帖子,确实帮我回忆了不少东西。
另外我还感觉到,c++ 里好多东西靠经验理解来的不一定对,虽然实际用上不会出什么问题,但还是小心应付好一点。
2011-05-12 11:37
xinyukkkk028
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2011-5-10
收藏
得分:0 
回复 6楼 pangding
回复6楼,a=(++c)+(++c)这个题我是自己试验过的,不管用GCC还是VC都是4.谢谢提出批评意见,对于左值右值我前部分已经有说明咯,也许是您忽略了,前置返回引用,引用当然是左值,后置返回值,当然是右值,只是说法不一样而已,嘿嘿,以后希望大家也能互相切磋切磋。我只是一个大一的学生。。这些只是我自己的经验。。只是有些学弟在问所以我就一次性把我的观点打了出来,至于您提到的那个后置传入默认参数的问题,这个不是我的说法。请参照机械工业出版社出版的《More Effective C++》由 Scott Meyers著,刘晓伟译的。第二章运算符里面有提到这个说法。。
2011-05-12 14:58
xinyukkkk028
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2011-5-10
收藏
得分:0 
以下是引用rjsp在2011-5-11 12:55:40的发言:

T& operator++ ()
{
    t += 1;
    return t;
}

const T& operator++( int )
{
    T temp = t;
    t += 1;
    return temp;
}


补充一点,这2个式子是正确的,这个就是解释了为什么C++返回的是自增前的值而如果用++c的取值是增加后的值了,希望能够使不是很明白的同学豁然开朗。
2011-05-12 15:00
xinyukkkk028
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2011-5-10
收藏
得分:0 
再祝今年马上高考的学弟学妹们高考成功!!!1热爱C++的人啊!高考伤不起啊!
2011-05-12 15:01
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
你试试这个代码,反正在我这(gcc 4.5)结果是 3。
程序代码:
#include <iostream>
using namespace std;

class Int {
public:
    int n;

    Int(int a = 0) : n(a) {}
    Int(const Int &a) : n(a.n) {}

    Int &operator++() { ++n; return *this; }
    Int operator++(int) { Int t(n); ++n; return t; }

    Int operator+(Int a) const { return Int(n + a.n); }
};

ostream &operator<< (ostream &os, const Int &a)
{
    os << a.n;
    return os;
}

int main(int argc, char *argv[])
{
    Int a, c;

    a = (++c) + (++c);

    cout << a << endl;

    return 0;
}

2011-05-20 11:02
快速回复:被a++和++a搞晕乎乎的童鞋们可以进来下啊~哈哈,顶顶~
数据加载中...
 
   



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

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