0Pricing
Lua Academy · レッスン

算術演算子と関係演算子

+、-、*、/、//、%、^および比較演算子を効果的に使えるようになります。

「算術演算子と関係演算子」はCoddyKit上の無料Lua Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLua Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Lua Academyコースには全4レッスンが含まれています。

算術演算子の概要

Luaには、算術演算子が一通り用意されています。+(加算)、-(減算)、*(乗算)、/(浮動小数点除算)、//(切り捨て除算)、%(剰余)、^(べき乗)、単項-(符号反転)です。Lua 5.3以降では、それぞれが整数と浮動小数点数のどちらを返すかを理解することが重要です。

print(10 + 3)   -- 13
print(10 - 3)   -- 7
print(10 * 3)   -- 30
print(10 / 3)   -- 3.3333...  (always float)
print(10 // 3)  -- 3          (floor division)
print(10 % 3)   -- 1          (modulo)
print(2 ^ 10)   -- 1024.0     (always float)
print(-5)       -- -5

整数除算と浮動小数点除算

/演算子は、2つの整数を割り切れる場合でも常に浮動小数点数を返します。切り捨て除算演算子//は、両方のオペランドが整数の場合に限り整数を返します。いずれかが浮動小数点数の場合、結果も浮動小数点数ですが、値は切り下げられます。

^演算子によるべき乗は常に浮動小数点数に変換されるため、2^3の結果は8ではなく8.0になります。必要であれば、math.tointeger()を使って元に戻してください。

print(6 / 2)        -- 3.0  (float!)
print(6 // 2)       -- 3    (integer)
print(6.0 // 2)     -- 3.0  (float floor)
print(7 // 2)       -- 3    (floor toward -inf)
print(-7 // 2)      -- -4   (floor, not truncate!)
print(2 ^ 3)        -- 8.0  (always float)

剰余演算子

Luaの%演算子は、a % b == a - floor(a/b) * bとして定義されています。つまり、結果の符号は被除数ではなく除数に従います。これは、結果の符号が被除数に従うCやJavaとは異なります。

剰余演算子は、値のラップ、配列の循環、リングバッファの実装に便利です。よくある用途として、i % nで0からn-1までを循環させる方法があります。

print(10 % 3)    --  1  (positive)
print(-10 % 3)   --  2  (sign of divisor!)
print(10 % -3)   -- -2  (sign of divisor)

-- Cycling 1..5 example
for i = 1, 8 do
  local idx = (i - 1) % 5 + 1
  io.write(idx .. " ")  -- 1 2 3 4 5 1 2 3
end

関係演算子

Luaの関係演算子はブール値を返します。==(等しい)、~=(等しくない)、<、>、<=、>=です。Luaでは、多くの言語で使われる!=ではなく、等しくないことを表すために~=を使う点に注意してください。

==で異なる型の値を比較すると、常にfalseになります。等価性のチェックで暗黙的な型変換は行われません。Luaでは1 == "1"はfalseです。

print(3 == 3)    -- true
print(3 ~= 4)    -- true
print(3 < 4)     -- true
print(3 >= 3)    -- true

-- No cross-type equality coercion
print(1 == "1")  -- false
print(0 == false) -- false

-- Strings compare lexicographically
print("abc" < "abd")  -- true

論理演算子: and、or、not

Luaの論理演算子はand、or、notです。多くの言語とは異なり、andとorはブール値を返さず、オペランドのいずれかを返します。これにより、デフォルト値や条件付き代入など、Luaらしいパターンを利用できます。

  • a and bは、aが偽値ならaを返し、それ以外の場合はbを返します
  • a or bは、aが真値ならaを返し、それ以外の場合はbを返します
-- and/or return operands, not booleans
print(1 and 2)        -- 2
print(false and 2)    -- false
print(1 or 2)         -- 1
print(false or 2)     -- 2

-- Default value idiom
local name = nil
local display = name or "Anonymous"
print(display)        -- Anonymous

三項演算子のイディオム

Luaには三項演算子(?:)はありませんが、and/orを使って再現できます。condition and value_if_true or value_if_falseというパターンは、value_if_trueがnilでもfalseでもない場合に機能します。

これはLuaで非常によく使われるイディオムです。ただし、真の分岐の値が文字通りfalseの場合はこのパターンが機能しないという例外に注意してください。その場合はif文を使用します。

local x = 10
-- Ternary idiom
local label = x > 5 and "big" or "small"
print(label)   -- big

-- Works for non-false truthy values
local age = 20
local status = age >= 18 and "adult" or "minor"
print(status)  -- adult

-- Edge case: true branch is false -> use if
local val = true and false or "fallback"
print(val)  -- fallback (wrong!)

演算子の優先順位

Luaの演算子の優先順位は、低い順にor、and、比較(< > <= >= == ~=)、|、~、&、シフト、..、+ -、* / // %、単項演算子(not # - ~)、^です。^と..の演算子は右結合で、それ以外は左結合です。

-- Precedence examples
print(2 + 3 * 4)     -- 14  (not 20)
print(2 ^ 3 ^ 2)     -- 512 (right assoc: 2^(3^2) = 2^9)
print(not 1 == 1)    -- false (not (1) == 1 => false == 1)
print(not (1 == 1))  -- false

-- Use parens to be explicit
print((2 + 3) * 4)   -- 20

ビット演算子(Lua 5.3以降)

Lua 5.3では、整数に対して動作するビット演算子が標準で追加されました。&(AND)、|(OR)、~(二項ではXOR、単項ではNOT)、<<(左シフト)、>>(右シフト)です。これらはライブラリを使用しない限り、Lua 5.1/5.2では利用できません。

ビット演算子のオペランドには整数が必要です。浮動小数点数を渡すと、その値が正確な整数値でない限り実行時エラーになります。

-- Bitwise operators (Lua 5.3+)
print(0xFF & 0x0F)   -- 15  (AND)
print(0xF0 | 0x0F)   -- 255 (OR)
print(0xFF ~ 0x0F)   -- 240 (XOR)
print(~0)            -- -1  (bitwise NOT)
print(1 << 4)        -- 16  (left shift)
print(256 >> 4)      -- 16  (right shift)

文字列の長さと連結

#演算子は文字列のバイト数を返し、..演算子は2つの文字列を連結します。数値に..を適用すると、Luaは数値を自動的に文字列へ変換します。一方、+で型を混在させる場合は型強制のルールに従い、数値に見える文字列を算術演算に使用できます。

local s = "hello"
print(#s)            -- 5
print(s .. " world") -- hello world
print(1 .. 2)        -- 12  (number to string)

-- Length of table = array part length
local t = {10, 20, 30}
print(#t)   -- 3

-- Beware: # on tables with holes is undefined
local h = {1, nil, 3}
print(#h)   -- 1 or 3 (undefined behavior!)

演算子に関するよくある間違い

Luaでは、演算子に関する次のようなバグがよく発生します。/が常に浮動小数点数を返すことを忘れる、~=の代わりに!=を使う(構文エラーになります)、0や""が偽値だと考える(実際には真値です)、真の分岐がfalseになる可能性があるのにand/orに頼る、といった間違いです。

境界条件は必ずテストしてください。特に//を使った負の数の整数除算では、負の無限大方向に切り下げられる点に注意が必要です。

-- Common mistakes
-- 1. / is always float
local result = 10 / 2
print(math.type(result))  -- float, not integer!

-- 2. ~= not !=
-- if x != 5 then  -- SYNTAX ERROR!
if 3 ~= 5 then print("not equal") end

-- 3. 0 is truthy
if 0 then print("0 is truthy in Lua!") end

-- 4. Negative floor division
print(-7 // 2)  -- -4 (not -3!)

クイックチェック

Luaで-7 // 2の結果は何ですか?

復習: 算術演算子と関係演算子

学習した重要なポイント:

  • /は常に浮動小数点数を返し、//は負の無限大方向に切り下げます
  • ^は常に浮動小数点数を返し、右結合です
  • ~=は不等価演算子です(!=ではありません)
  • and/orはブール値ではなくオペランドを返すため、デフォルト値のイディオムに利用できます
  • 偽値はnilとfalseだけです。0と""は真値です
  • ビット演算子(& | ~ << >>)にはLua 5.3以降の整数が必要です

次は、型強制と明示的な変換関数です。

よくある質問

「算術演算子と関係演算子」レッスンは無料ですか?

はい。「算術演算子と関係演算子」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Lua Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Lua Academyコースには全4レッスンが含まれています。

「算術演算子と関係演算子」で何を学びますか?

+、-、*、/、//、%、^および比較演算子を効果的に使えるようになります。 ブラウザで直接実行するハンズオンコードでLua Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Lua Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのLua Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「算術演算子と関係演算子」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このLua Academyレッスンでコードを書いて実行できますか?

はい。すべてのLua Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Luaのデータ型の概要
  2. Luaで変数を宣言する
  3. 算術演算子と関係演算子
  4. 型強制と型変換
← Lua Academyに戻る