写在前面
记得一次写题时将++i写成了i++,怎么也调试不对QAQ,事后也不明白,现在水发一篇总结( ̄y▽, ̄)╭
一、赋值顺序
i++在运行时是这样执行的:先赋值,再自加
用代码表示为
a = i++; ------------> a = i; i = i + 1;
++i在运行时是这样执行的:先自加,再赋值
用代码表示为:
a = ++i --------------------> i = i + 1; a = i;
形象地理解为i++先做别的事,再自己加,++i先自己加,再做别的事情
比如i = 3,a = i++就是说a = 3,完成之后让i变成4,a = ++i就是先让i++变成4,然后a = 4
二、效率
i++;++i;就C语言代码来看,i++ 和 ++i 都只有一行,看起来似乎二者的执行效率一样了?(连我这种蒟蒻都知道不是的)
我们先看一下下面这段代码:
int i,a,b;
i = 0;
a = i++;
i = 0;
b = ++i;
查看上述C语言代码对应的汇编代码可见,j=i++; 计算机需要 4 条指令来解释,比执行 k=++i; 多出了一条指令。多出的一条指令为:在对 i 执行自加操作之前,先保存 i 的当前值留作稍后使用(赋值为a)。所以,++i的效率比i++高
三、左值和右值
可能很多人并不知道啥是左值,说白了,左值就是可以放在赋值符左边的变量,而右值是所有不是左值的式子的值。
但能否被赋值不是区分左值与右值的依据。比如,C++的const左值是不可赋值的;而右值可能允许被赋值。左值与右值的根本区别在于是否允许取地址&运算符获得对应的内存地址。
而i++不能作为左值,++i则可以!!!
例如下面这段代码:
i++ = a; //错误语句
++i = a //正确