For循环如何在VB.NET中运行?

时间:2009-04-13 21:32:08

标签: 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

编译成这个(我把它放在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

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

2 个答案:

答案 0 :(得分:8)

可能是因为它是涵盖所有案例的“通用方式”。请记住,/ step / next可以向任何方向前进,并且增量上有任何符号。

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

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

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

=== UPDATE ===

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

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

所以,对于s&lt; 0,你最终得到

while (-i-1)<=(-n-1) 
==> while -i <= -n
==> while i>=n

对于s&gt; 0,你最终得到

while i <= n

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

答案 1 :(得分:0)

我想明显的答案是For Next循环可以写成Do While循环并将其转换为另一个循环意味着你只需要在编译器中实现一种类型的循环。 我可以看到它是如何工作的,但为什么它已经完成,我不知道。