C#中i++和++i的底层原理

一:前言

我们都知道,i++是先取值,后计算。++i是先计算,后取值。下面说下它的底层原理

运算符优先级与运算顺序:
运算符的优先级只是影响了表达式中的结合顺序,不会影响运算顺序,运算顺序永远都是从左至右计算
例如如下的代码:
int x = 3;
int y = 1 || (x = 1) && (x += 1);
运行后x=3,y=1。因为虽然&&的优先级高于||,但是运算时还是从左至右计算,||的短路作用导致||后面不需要计算了


二:原理

int i = 0;
i++;
Console.WriteLine(i);

结果是1
执行步骤是:
1.将常量0压入操作数栈中
2.从栈中取出元素0,局部变量+1后再压入栈
3.输出时取栈顶元素1 
无论是i++还是++i,底层执行都是一样的,因为这里并没有将++作为赋值表达式符号,底层也就视为只是将变量+1的操作,所以是没有区别的


 

int i = 0;
i = i++;
Console.WriteLine(i);

结果是0
执行步骤是:
1.将常量0压入操作数栈中
2.从栈中取出元素0,将0入栈,然后再将局部变量i的值+1,此时i=1,接着赋值的时候将栈中元素赋给i,i又被赋值为0,再入栈
3.输出时取栈顶元素0
因为i++会创建临时变量,所以使用++i会减少一个变量的创建,但是这种性能上的优化对于一个值类型变量来说可忽略不计


 

int i = 0;
i = ++i;
Console.WriteLine(i);

结果是1
执行步骤是:
1.将常量0压入操作数栈中
2.从栈中取出元素0,将局部变量i的值+1,此时i=1,再入栈
3.输出时取栈顶元素1


 

扫描二维码关注公众号,回复: 15999672 查看本文章
int i = 1;
i = ++i + i++;
Console.WriteLine(i);

结果是4
执行步骤是:
1.将常量1压入操作数栈中
2.从栈中取出元素1赋值给i,将i的值+1后等于2再入栈,此时i=2。2再次入栈,然后再将i的值+1,此时i=3,计算时使用操作数栈中的2和2相加结果为4,再赋值给i,再将i入栈
3.输出时取栈顶元素4


三:总结

i++先入栈再+1,++i先+1再入栈

猜你喜欢

转载自blog.csdn.net/LLLLL__/article/details/132018966