C# i=0;i=i++;结果i=0;

 int i =0;i=i++;  看起来结果好像是1;实际却是0;通过IL 反汇编程序查看生成的msil来了解执行细节。

在此之前先了解几个内容:

程序在运行时内存中分成了多个区域,其中包括 

evaluation stack : 可以理解为用来保存表达式的操作数的临时容器 ,线程独立。[MS-VGSFF]: Evaluation Stack | Microsoft Docs  评估堆栈是一个 堆栈 ,因此是一个后进/先出 (LIFO) 工具。当函数启动时,评估堆栈为空。当函数运行时,项目从评估堆栈中被推送和弹出。在函数退出之前,除了返回值之外,评估堆栈必须再次为空。jmptail指令是此规则的 例外。如果评估堆栈在退出时不为空,则运行时会引发 InvalidProgramException 异常。

call stack:调用栈,方法执行时保存数据的容器。每个方法执行时都会在该区域创建一个线程栈,不同的线程之间相互隔离。

local variable list: 局部变量区域,归属于call stack的线程栈内。

Managed Heap托管堆,由GC负责回收,线程之间共享。

 代码异常简单:

public void Test() 
{
     int i = 0;
     i =i++;
     Console.WriteLine(i);
}

以下是中间码:

.maxstack  3
  .locals init (int32 V_0)  
  IL_0000:  nop  空指令;
  IL_0001:  ldc.i4.0   
  IL_0002:  stloc.0    
  IL_0003:  ldloc.0   
  IL_0004:  dup  
  IL_0005:  ldc.i4.1  
  IL_0006:  add   
  IL_0007:  stloc.0   
  IL_0008:  stloc.0  
  IL_0009:  ldloc.0 
  IL_000a:  call       void [System.Console]System.Console::WriteLine(int32)  
  IL_000f:  nop 空指令
  IL_0010:  ret   

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值