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 do | 1 から n まで 1 ずつカウントアップします。ステップを省略した最も基本的な書き方です。 |
for i = 1, n, step do | 1 から n まで step ずつ変化させます。step には任意の整数・実数を指定できます。 |
for i = n, 1, -1 do | n から 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 ループ が適しています。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。