言語
日本語
English

Caution

お使いのブラウザはJavaScriptが無効になっております。
当サイトでは検索などの処理にJavaScriptを使用しています。
より快適にご利用頂くため、JavaScriptを有効にしたうえで当サイトを閲覧することをお勧めいたします。

Lua辞典

  1. トップページ
  2. Lua辞典
  3. for i=start,stop(数値 for ループ)

for i=start,stop(数値 for ループ)

『Lua』の数値 for ループ(for i=start,stop do)は、整数・実数の範囲を指定して繰り返し処理を行う最も基本的なループ構文です。ステップ値を省略すると 1 ずつカウントアップし、負のステップを指定すると逆順にカウントダウンできます。

構文

-- -----------------------------------------------
-- 数値 for ループの基本構文
-- -----------------------------------------------

-- ステップ省略(1 ずつカウントアップ)
for i = start, stop do
    -- i は start から stop まで 1 ずつ増加します
    -- ループ変数 i はループブロック内でのみ有効です(ローカルスコープ)
end

-- ステップ指定
for i = start, stop, step do
    -- i は start から stop まで step ずつ変化します
    -- step が正なら昇順、負なら降順になります
end

-- -----------------------------------------------
-- break によるループの中断
-- -----------------------------------------------

for i = start, stop do
    if 条件 then
        break  -- ループを即座に終了します
    end
end

構文一覧

構文概要
for i = 1, n do1 から n まで 1 ずつカウントアップします。ステップを省略した最も基本的な書き方です。
for i = 1, n, step do1 から n まで step ずつ変化させます。step には任意の整数・実数を指定できます。
for i = n, 1, -1 don から 1 まで 1 ずつカウントダウンします。逆順ループには step に -1 を指定します。
breakループを即座に中断します。if と組み合わせて特定条件での早期終了に使います。
ループ変数のスコープループ変数(例: i)はループブロック内のみ有効なローカル変数です。ループ外からはアクセスできません。

サンプルコード

eva_for_numeric.lua
-- eva_for_numeric.lua — 数値 for ループのサンプルです
-- エヴァンゲリオンのキャラクターを使って
-- カウントアップ・カウントダウン・ステップ・break を確認します

-- -----------------------------------------------
-- 基本:1 から n まで(ステップ省略)
-- -----------------------------------------------

local pilots = { "碇シンジ", "綾波レイ", "惣流・アスカ・ラングレー" }

print("=== エヴァパイロット一覧 ===")
-- 1 から #pilots(配列の要素数)まで 1 ずつカウントアップします
for i = 1, #pilots do
    print(i .. ". " .. pilots[i])
end
print("")

-- -----------------------------------------------
-- ステップ指定:2 ずつカウントアップ
-- -----------------------------------------------

print("=== 奇数番号のシンクロ率チェック ===")
local sync_rates = { 41.3, 62.7, 77.4, 50.0, 99.5 }

-- 1, 3, 5 のインデックスだけを処理します
for i = 1, #sync_rates, 2 do
    print(string.format("  インデックス %d: シンクロ率 %.1f%%", i, sync_rates[i]))
end
print("")

-- -----------------------------------------------
-- 逆順ループ:カウントダウン(step = -1)
-- -----------------------------------------------

print("=== 発進カウントダウン ===")
-- 5 から 1 まで 1 ずつカウントダウンします
for i = 5, 1, -1 do
    print("  " .. i .. "...")
end
print("  初号機、発進!")
print("")

-- -----------------------------------------------
-- break:条件を満たしたらループを中断
-- -----------------------------------------------

print("=== 使徒検索(最初に脅威度 80 以上を発見したら停止) ===")
local apostles = {
    { name = "第3使徒 サキエル",   threat = 55 },
    { name = "第4使徒 シャムシェル", threat = 60 },
    { name = "第5使徒 ラミエル",   threat = 92 },
    { name = "第6使徒 ガギエル",   threat = 70 },
    { name = "第7使徒 イスラフェル", threat = 75 },
}

for i = 1, #apostles do
    local a = apostles[i]
    print(string.format("  検索中... %s(脅威度: %d)", a.name, a.threat))
    if a.threat >= 80 then
        print("  → 高脅威度使徒を検出!ミサトさんに緊急報告します。")
        break  -- 条件を満たしたらループを中断します
    end
end
print("")

-- -----------------------------------------------
-- ループ変数のスコープ確認
-- -----------------------------------------------

print("=== ループ変数のスコープ ===")
for i = 1, 3 do
    -- i はこのブロック内でのみ有効なローカル変数です
    local msg = string.format("  ループ内 i = %d(渚カヲルの出番%d回目)", i, i)
    print(msg)
end
-- ここで i を参照すると nil になります(ループ外ではアクセス不可)
print("  ループ外で i を参照: " .. tostring(i))  -- nil が出力されます
print("")

print("全チェック完了。")
lua eva_for_numeric.lua
=== エヴァパイロット一覧 ===
1. 碇シンジ
2. 綾波レイ
3. 惣流・アスカ・ラングレー

=== 奇数番号のシンクロ率チェック ===
  インデックス 1: シンクロ率 41.3%
  インデックス 3: シンクロ率 77.4%
  インデックス 5: シンクロ率 99.5%

=== 発進カウントダウン ===
  5...
  4...
  3...
  2...
  1...
  初号機、発進!

=== 使徒検索(最初に脅威度 80 以上を発見したら停止) ===
  検索中... 第3使徒 サキエル(脅威度: 55)
  検索中... 第4使徒 シャムシェル(脅威度: 60)
  検索中... 第5使徒 ラミエル(脅威度: 92)
  → 高脅威度使徒を検出!ミサトさんに緊急報告します。

=== ループ変数のスコープ ===
  ループ内 i = 1(渚カヲルの出番1回目)
  ループ内 i = 2(渚カヲルの出番2回目)
  ループ内 i = 3(渚カヲルの出番3回目)
  ループ外で i を参照: nil

全チェック完了。

よくあるミス

よくあるミス1: ループ変数をループ外で変更しようとする

数値 for ループのループ変数はループ内でローカルとして扱われます。ループ内で変数に代入しても次のイテレーションでリセットされ、期待した動作になりません。

ng_example.lua
for i = 1, 5 do
    if i == 3 then
        i = 10  -- ループ変数を変更してもループは止まらない
    end
    print(i)
end
1
2
10
4
5

ループを途中で抜けたい場合は break を使います。

ok_example.lua
for i = 1, 5 do
    if i == 3 then
        break
    end
    print(i)
end
1
2

よくあるミス2: 浮動小数点数のステップで丸め誤差が累積する

ステップに浮動小数点数を使うと、丸め誤差が累積して期待回数と異なることがあります。整数インデックスで制御して内部で計算する方法を使います。

ng_example2.lua
local count = 0
for i = 0.0, 1.0, 0.1 do
    count = count + 1
    print(string.format("%.1f", i))
end
print("count:", count)  -- 期待: 11 回だが…
0.0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1.0
count:	11

整数カウンターを使って内部で浮動小数点に変換します。

ok_example2.lua
for i = 0, 10 do
    local x = i / 10.0
    print(string.format("%.1f", x))
end
0.0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1.0

概要

数値 for ループは for i = start, stop, step do ... end の形式で記述します。step を省略すると 1 が使われ、start から stop まで 1 ずつカウントアップします。ステップに負の値(例: -1)を指定すると逆順のカウントダウンになります。ループ変数(例: i)は Lua が自動的にローカル変数として扱うため、ループブロック外からはアクセスできず nil が返ります。ループの途中で抜けたい場合は break を使います。なお、テーブルの全要素を順番に走査したい場合は数値 for ループではなく ipairs を使った汎用 for ループ が適しています。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。