上学时学的++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 总结
++i | i++ |
---|---|
内存 | 寄存器 |
左值 | 右值 |
直接对内存进行操作 | 产生临时变量效率低 |
Java
不管是i++
还是++i
,都是右值。
参考:
- https://stackoverflow.com/questions/371503/why-is-i-considered-an-l-value-but-i-is-not
- https://stackoverflow.com/questions/27021465/why-does-a-not-compile-in-c-but-a-does
- https://blog.youkuaiyun.com/chenweiyu11962/article/details/79232626