++i 和 i++ 那点事

上学时学的++i和i++,区别就是返回值加没加1. 实际远不止如此。

C++/C

1 为什么推荐前置++

对于需要变量自增的操作而言,i++没有产生临时变量(寄存器上),效率高
for(int i=0; i < 100; ++i) ...

2 为什么++i是左值

++i的操作:首先i自增1,将i的值作为表达式的值。
表达式的值来自内存上的i
来自内存,也就是可以获得地址,所以是左值。(左值右值的区别参见上一篇)

3 为什么i++是右值

i++的操作:首先将i的值放到寄存器上,并作为表达式的值,再将i的内存+1
表达式的值来自寄存器
无法获得地址,所以是右值。
(寄存器上的临时变量修改没有意义,所以寄存器的值不能修改。因此又有右值不能修改的说法)

4 为什么只有(++i)++是合法的

(++i)++ 相当于:

++i;
i++;

++(i++)相当于:

++5

++i++,根据后置++的优先级高,实际是++(i++)

5 总结

++ii++
内存寄存器
左值右值
直接对内存进行操作产生临时变量效率低

Java

不管是i++还是++i,都是右值。

参考:

  1. https://stackoverflow.com/questions/371503/why-is-i-considered-an-l-value-but-i-is-not
  2. https://stackoverflow.com/questions/27021465/why-does-a-not-compile-in-c-but-a-does
  3. https://blog.youkuaiyun.com/chenweiyu11962/article/details/79232626
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值