For循环在VB.NET中是如何工作的?
我想我知道这个。。。我不知道 这是一个简单的For循环:For循环在VB.NET中是如何工作的?,vb.net,compiler-construction,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$
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
Dim n作为整数=10
Dim VB$t_i4$L1为整数=1
Dim VB$t_i4$L0作为整数=n
尺寸i为整数=0
做While((VB$t_i4$L1>&H1F)Xor i>&H1F)Xor VB$t_i4$L0))
控制台写入线(i)
i=(i+VB$t_i4$L1)
环
为什么For循环会这样被破坏?可能是因为它是覆盖所有情况的“通用方法”。请记住,for/step/next可以向任何方向移动,并且在增量上有任何符号
在增量和结束边界上都使用了参数。编译器无法知道您是要向上计数还是向下计数,以及th end bound是高于还是低于start bound
我的猜测是,这是一种获得代码的方法,无论你在n和s中输入什么,它都能工作(只是一种猜测,我太累了,无法尝试看看是否是这样)
它还复制参数以防止外部干扰(如在枚举期间更改s或n)
==更新===
我怀疑是否有人还在关注这个问题,但我回到这个掘金只是为了完整性,因为我有一些时间。
VB所做的有点鬼鬼祟祟。S的位移位基本上是基于S的符号创建一个整数(它复制S的MSB,最后是&hffffff is S为负,如果S为正,则为&h00000000)
整数值与-1的异或等于(-value-1)。带有0的XOR显然是NOP。
因此,如果s为负值,它会反转两个值(-1相互抵消)以进行比较,从而有效地反转比较顺序,而无需使用或使用条件,因此程序流中不会出现跳转。
如果s为正值,则只对其进行比较
所以,对于s=n
对于s>0,您最终会得到
while (-i-1)<=(-n-1)
==> while -i <= -n
==> while i>=n
while i <= n
而我可能是因为它是覆盖所有情况的“通用方法”。请记住,for/step/next可以向任何方向移动,并且在增量上有任何符号
在增量和结束边界上都使用了参数。编译器无法知道您是要向上计数还是向下计数,以及th end bound是高于还是低于start bound
我的猜测是,这是一种获得代码的方法,无论你在n和s中输入什么,它都能工作(只是一种猜测,我太累了,无法尝试看看是否是这样)
它还复制参数以防止外部干扰(如在枚举期间更改s或n)
==更新===
我怀疑是否有人还在关注这个问题,但我回到这个掘金只是为了完整性,因为我有一些时间。
VB所做的有点鬼鬼祟祟。S的位移位基本上是基于S的符号创建一个整数(它复制S的MSB,最后是&hffffff is S为负,如果S为正,则为&h00000000)
整数值与-1的异或等于(-value-1)。带有0的XOR显然是NOP。
因此,如果s为负值,它会反转两个值(-1相互抵消)以进行比较,从而有效地反转比较顺序,而无需使用或使用条件,因此程序流中不会出现跳转。
如果s为正值,则只对其进行比较
所以,对于s=n
对于s>0,您最终会得到
while (-i-1)<=(-n-1)
==> while -i <= -n
==> while i>=n
while i <= n
while i我想最明显的答案是For Next循环可以写成Do while循环,将一个循环转换为另一个循环意味着只需在编译器中实现一种类型的循环。
我可以看到这是如何工作的,但我不知道为什么要这样做。我想显而易见的答案是,For Next循环可以写成Do While循环,将一个循环转换为另一个循环意味着只需在编译器中实现一种类型的循环。
我知道这是怎么回事,但我不知道为什么会这样