1. 程式人生 > >關於lua數字for迴圈的實現

關於lua數字for迴圈的實現

看以下程式碼:

for i=1,2 do
  print(i)
  i=3
end

輸出是什麼?如果習慣了C/C++語言,會覺得因為改變了控制變數i為3,所以在執行第二次迴圈體之前判斷不通過,所以輸出是1。

但結果輸出是1和2,即雖然改變了i,但迴圈還是執行了2次。這是為什麼呢?

看了lua的原始碼,發現在語法分析階段,表示式中的i(也叫控制變數)和迴圈體中的i並不是一個值,其實表示式中的i叫internal index,迴圈體中的i叫external index。

所以在迴圈體中並沒有改變表示式中的i的值。

至於為什麼lua要這樣做,估計是為了安全吧,怕在迴圈體中不經意地改變了表示式的i,從而產生bug。

另外,在Progammming in Lua一書中也提到不要在迴圈體內修改控制變數(實際修改的是external index)的值,否則會有不可預知的結果。