For循环如何在VB.NET中工作?

Pra*_*ter 1 vb.net compiler-construction

我虽然知道这一个...我不知道.

这个简单的For循环:

Dim i As Integer
Dim n As Integer = 10
Dim s As Integer = 1

For i = 0 To n Step s
    Console.WriteLine(i)
Next
Run Code Online (Sandbox Code Playgroud)

编译成这个(我把它放在Refelctor中,所以它更容易阅读).我甚至无法得到所有这些位移的功能:

Dim n As Integer = 10
Dim VB$t_i4$L1 As Integer = 1
Dim VB$t_i4$L0 As Integer = n
Dim i As Integer = 0
Do While (((VB$t_i4$L1 >> &H1F) Xor i) <= ((VB$t_i4$L1 >> &H1F) Xor VB$t_i4$L0))
    Console.WriteLine(i)
    i = (i + VB$t_i4$L1)
Loop
Run Code Online (Sandbox Code Playgroud)

为什么For循环被这样残缺?

Den*_*ler 8

可能是因为它是涵盖所有案例的"通用方式".请记住,/ step/next可以向任何方向移动,并且增量上有任何符号.

您在增量和结束时使用了参数.编译器无法知道您是否要向上或向下计数,以及结束时是否高于或低于起始界限.

我猜这是一种获取代码的方法,无论你在n和s中放置什么(只是一个猜测,我太累了,不能尝试看看是否是这种情况).

它还复制参数以防止外部干扰(如在枚举期间更改s或n).

===更新===

我怀疑还有人在看这个问题,但我只是为了完整而回到这个金块,因为我有一些时间.VB正在做的事情有点偷偷摸摸.S的位移基本上根据S的符号创建一个整数(它复制s的MSB,以&hFFFFFFFF结束,S为负,如果S为正,则为&h00000000).

具有-1的整数值的XOR等效于(-value-1).与0的XOR显然是NOP.因此,如果s是负数,它会反转两个值(-1相互抵消)来比较它们,有效地反转比较的顺序而不需要或有条件,因此没有跳过程序流程.如果s为正数,则仅比较它们.

所以,对于s <0,你最终得到了

while (-i-1)<=(-n-1) 
==> while -i <= -n
==> while i>=n
Run Code Online (Sandbox Code Playgroud)

对于s> 0,你最终得到了

while i <= n
Run Code Online (Sandbox Code Playgroud)

让我回到我的68k ASM日,那里有日常用品的技巧(例如XOR.l D0,D0,因为XORing自身的寄存器比加载零的速度快......):p