i++ 究竟是什么
紧接着之前写的文章。
我尝试了一下这几行代码:
1 2 3 | int i = 3; int j = (++i) + (++i); printf("%d\n", j); |
结果 g++ 给我的结果是 10. 而昨天这段代码:
1 2 3 | int i = 3; int j = (++i) + (++i) + (++i); printf("%d\n", j); |
结果是 16 就好解释了。因为我把 ++i 看成是一个函数的调用:
1 2 3 4 | int &operator++() { *this = *this + 1; return *this; } |
然后 int j = (++i) + (++i) + (++i); 可以看成:
int j = operator+( operator+( i.operator++(), i.operator++() ), i.operator++() );
可能你会看得很蛋疼,函数的嵌套太多了。其实是这样的,右边的整个表达式是一个 operator+(int, int) 函数的调用,首先这个函数需要知道它的两个参数的值,从第一个参数开始算起。而这第一个参数是一个 operator+(int, int) 函数,它也需要计算两个表达式的值,也是从它的第一个参数开始算起。它的第一个参数是 i 的 operator++() 函数,此时 i 自增 1, 计算出的结果是 i 的引用。然后第二个参数也会让 i 自增 1, 结果也是 i 的引用。此时 i 的值是 5, 然后两个参数都是 i 的引用,同时传给 operator+(int, int) 函数,这时,内层的 operator+(int, int) 得到的结果就是 10. 当然此时再去计算外层 operator+(int, int) 的第二个参数,它会让 i 自增 1, 之后返回 i 的引用,此时 i 是 6, 所以外层的 operator+(int, int) 的结果,就是 16.
我上一篇文章中,还在 (++i) 外套了一个函数,结果成了 15. 那也是可以解释的。因为那个函数是返回一个 int 的,而不是 i 的引用,所以就拿那个变量当时的值来算了。
所以其实 ++i 出现这样的结果是合情合理的,它是遵循了我“函数一统天下”的理念的。但是 i++ 呢?因为昨天在 (i++) 外套一个函数得到的结果也是和谐盛世的结果,而不套函数得到的就是蛋疼的结果,难道 i++ 返回的也是一个引用吗?我尝试了一下 (i++) = 1; 而编译器给了一个错误:
error: lvalue required as left operand of assignment
编译器说它想要左值,这就说明它事与愿违了,所以 (i++) 不是一个左值……
究竟 i++ 是什么???
原创文章,转载请注明来源:http://euyuil.com/1842/what-the-fuck-is-i-plusplus/

函数嵌套?似乎有点有趣了…
类似于递归调用吧…
i++本身就是个赋值操作
博主的文章很不错,我是站长工具-站长精灵的作者,一款专业的SEO工具软件(可以帮您提高博客的流量),想跟您交换个链接,不知可否