繁体   English   中英

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

[英]How does For loop work in 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循环会被这样破坏?

可能是因为这是涵盖所有情况的“通用方式”。 请记住,for / 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

对于s> 0,您最终得到

while i <= n

让我回到我的68k ASM时代,这些技巧每天都在起作用(例如XOR.l D0,D0,因为对其自身进行寄存器异或比在其中加载零要快...):p

我猜最明显的答案是,For Next循环可以写为Do While循环,将其转换为另一个循环意味着您仅需在编译器中实现一种循环类型。 我可以看到它是如何工作的,但是为什么要这样做,我不知道。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM