[杂谈] 路遇一脑残题 - a++以及++a

下面哪个式子不正确?
int a = 4;
A、a += (a++);
B、(++a) += (a++);
C、a += (++a);
D、(a++) += a;




























答案是 D、(a++) += a;

一个表达式,需要把结果赋值给等于号的左边,即“左值”。
对象指的是某个具体的变量,左值就是对象的地址。
a = a + 5这样的表达式,左值是a,a具有实实在在的内存地址以及数值。
A + B = a + 5;左值为“A + B”, A有值,B有值,但是A+B的值是由系统临时生成,在内存的临时区域存着,
你可以说就算是临时区也有地址,那有什么意义呢,不知道地址,不能赋值,唯一知道的只是它存在于临时的区域中。说白了就是没有显式的存储地址。看选项,D的左边是a++,
++a返回的是(a+1)这个变量。
a++返回的是a的一个副本,也就是一个临时对象,temporary object。
显然不能往临时变量里赋值,D错误。
现在看看别的选项。
A、a += (a++);
看到这种问题非常讨厌,中国式教育特有的SB题。
在C语言中,对于这种式子并没有严格的规定,所以具体的执行就落在了编译器上,
对于这种未定义式,例如,式子中到底是先赋值还是先自增,则完全取决于编译器——“
两件事我都会去做,至于先做什么后做什么就是我自己的事情了。 ”如果把这种式子放在有严格定义的C#之类的语言中则很明确。现在以C语言的目光来看待:
如果一个式子很麻烦,可以拆分语句(前缀自增的放前面,后缀自增的放后面)
a+=(a++);
可以如下看待:
a += a;
a++;
所以答案是9
B、(++a) += (a++);
继续拆:
a++;
a += a;
a++;
答案是11

C、a += (++a);
a++;
a += a;
答案是10
总结:这种编译器相关的代码,并且没有任何附加说明地出成题目,完全是脑残行为,根本就不应该出现在教科书上,特别是初学者所接触的教科书。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值