深度解析自加自减运算 ++ --
关于自减自减运算,这是一个比较让人纠结的问题。
初级认识
int i=3;
int j;
j=i++;或者j=++i;
当为前者时 先把i的值赋予j,然后i++。
当为后者时先把i自加,然后把i赋予j。
为什么是这样子的呢?因为当编译器解析这个表达式时,运算符有两个,一个“= ”一个“++”。因为++优先级比较高,所以应该先做运算,但是该符号的结合方向是由右向左,当j=i++时,++右边是没有变量的。所以i没有一开始就自加。当所有运算结束时,i才自加。
中级认识
[html]
int i=3;
int j;
j=i++ + ++i;或者j=++i + ++i;或者j=i++ + i++;
第一种情况,为j=4+4=8,i=5.
第二种情况,为j=5+5=10,i=5;
第三种情况,为j=3+3=6,i=5;
为什么是这个样子呢?还是从编译器解析表达式谈起,运算符有四个:两个“++”,一个“=”,一个“+"。按照优先级应该先运算++,再运算+,再运算=。考虑到++的结合方向,所以当++位于自变量的右侧时,自变量不变。当位于自变量左侧时自变量先进行运算。考虑系统只为自变量i分配了唯一的内存空间,对于第一种情况先考虑的是 i++和++i,i++没有改变i的值,i++是的i=4,编译器会,当编译器从内存中读取i的值赋予i++时,i的值早已变成了4.所以会有j=4+4=8。第二种情况++i和++i,系统会将i的值加1,存回i存储空间。在从i存储空间读出,自加1,再存回i存储空间。现在i的内存空间值已变成5.系统从i内存空间中读取值相加,得到j=5+5=10.第三种情况 i++和i++,++在右侧,变量i不做处理。直接从i存储空间取值相加,得到j=3+3=6。最后才对i进行两次自加。
深度认知
(++i)+=(i++);
[html]
(++i)=(++i)+(i++);
不等效。第一种情况为11,第二种情况为13.
补充:软件开发 , 其他 ,