找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2129|回复: 0
收起左侧

a++ 与 ++a的一个区别

[复制链接]
ID:102014 发表于 2016-1-6 03:48 | 显示全部楼层 |阅读模式
大家都知道a++是先取a的值再把a=a+1,++a先把a=a+1,再取a的值。
其实其区别不仅如此,看看下面的问题:
下面的表达式是对或错?是对的话请写出a的值。
int a = 4;
A)(a++) += a;
B)(++a) += a;

在编译器中我们可以得出结论:
A是错误的,而B是正确的,并且B中的a的值为10.

解析:
A)(a++) += a;//
可以拆分为下面的表达式:
const int __temp = a;
__temp = __temp + a;//注意:因为当运算“=”表达式时,编译器会先计算“=”的右边,所以这里的a是原来的值,而不是a++后的值。
a++;
之所以错误,是因为__temp是编译器自动加的临时值是const类型的,不能给其赋值。

B)(++a) += a;
可以拆分为下面的表达式:
a = (a+1) + a;//注意:在(a+1) + a 中,(a+1)是因为“=”左边的++a。
a++;
没用进行违规的操作,所以能通过的。

额外思考:
1)编译器自动添加的临时变量是不可以被程序员修改的;
2)进行b = ++a;运算比进行b = a++;更快更节省空间;b = a++;比b = ++a;多了__temp = a;的运算和__temp的空间开销。



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表