2009-04-13 88 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循環並將其轉換爲另一個意味着你只需要在編譯器中實現一種循環。 我可以看到這是如何工作,但爲什麼這樣做,我不知道。