2009-04-13 85 views
1

虽然我知道这一个......我不知道。For循环如何在VB.NET中工作?

这种简单的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循环是这样残破?

回答

8

可能是因为它是涵盖所有情况的“通用方式”。请记住,对于/ step/next,可以在任何方向上使用增量上的任何符号。

您在增量和结束边界上都使用了参数。编译器无法知道您是要计数还是减少,并且如果第一个界限高于或低于开始界限。我的猜测是这是一种获取代码的方法,无论你在n和s中放置什么(只是猜测,我太累了,不会去尝试看看是否是这种情况)。

此外,它使参数的副本,以防止外部干扰(如在枚举过程中更改s或n)。

=== UPDATE ===

我怀疑有人还在看着那问题,但我回来这块金块只是为了完整起见,因为我有一段时间了。 VB在做什么有点鬼鬼祟祟。 S的位移基本上根据S的符号创建整数(它复制s的MSB,如果S为正数,则以& hFFFFFFFF为S为负并且为&h00000000)。

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

因此,对于s < 0你最终

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

为S> 0你最终

while i <= n 

把我带回到我的68K ASM天每天在那里这样的招数在那里东西(比如XOR.l D0,D0,因为XOR与一个寄存器本身比加载零速度快...):p

0

我猜显然的答案是,For Next循环可以写成Do w^hile循环并将其转换为另一个意味着你只需要在编译器中实现一种循环。 我可以看到这是如何工作,但为什么这样做,我不知道。