0Pricing
Lua Academy · บทเรียน

ตัวดำเนินการเลขคณิตและความสัมพันธ์

ใช้ +, -, *, /, //, %, ^ และตัวดำเนินการเปรียบเทียบได้อย่างมีประสิทธิภาพ

ตัวดำเนินการเลขคณิตและความสัมพันธ์ เป็นบทเรียน Lua Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน 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^3 จึงได้ 8.0 ไม่ใช่ 8 หากจำเป็น ให้ใช้ 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 ใน Lua

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 จะไม่คืนค่าบูลีน แต่จะคืนค่าตัวถูกดำเนินการตัวใดตัวหนึ่ง จึงสามารถใช้รูปแบบสำนวนที่พบบ่อย เช่น การกำหนดค่าเริ่มต้นและการกำหนดค่าแบบมีเงื่อนไขได้

  • 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)

ความยาวและการต่อสตริง

ตัวดำเนินการ # จะคืนค่าความยาวของสตริงเป็นไบต์ ส่วนตัวดำเนินการ .. จะนำสตริงสองสายมาต่อกัน เมื่อใช้ .. กับตัวเลข 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 หรือ "" เป็นค่าเท็จ (แต่ทั้งคู่เป็นค่าจริง) และพึ่งพา and/or ทั้งที่แขนงค่าจริงอาจเป็น false

โปรดทดสอบเงื่อนไขขอบเขตเสมอ โดยเฉพาะการหารปัดเศษด้วยจำนวนลบ ซึ่ง // จะปัดลงเข้าหาอนันต์ลบ

-- 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!)

ตรวจสอบอย่างรวดเร็ว

ผลลัพธ์ของ -7 // 2 ใน Lua คืออะไร

ทบทวน: ตัวดำเนินการเลขคณิตและความสัมพันธ์

ประเด็นสำคัญที่ได้เรียนรู้:

  • / จะคืนค่าทศนิยมเสมอ ส่วน // จะปัดลงเข้าหาอนันต์ลบ
  • ^ จะคืนค่าทศนิยมเสมอและจับกลุ่มจากขวาไปซ้าย
  • ~= คือตัวดำเนินการไม่เท่ากับ (ไม่ใช่ !=)
  • and/or จะคืนค่าตัวถูกดำเนินการ ไม่ใช่บูลีน จึงใช้สร้างสำนวนกำหนดค่าเริ่มต้นได้
  • มีเพียง nil และ false เท่านั้นที่เป็นค่าเท็จ ส่วน 0 และ "" เป็นค่าจริง
  • ตัวดำเนินการระดับบิต (& | ~ << >>) ต้องใช้จำนวนเต็มใน Lua 5.3 ขึ้นไป

ถัดไป: การบังคับชนิดข้อมูลและฟังก์ชันแปลงชนิดข้อมูลอย่างชัดเจน

คำถามที่พบบ่อย

บทเรียน “ตัวดำเนินการเลขคณิตและความสัมพันธ์” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “ตัวดำเนินการเลขคณิตและความสัมพันธ์” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Lua Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “ตัวดำเนินการเลขคณิตและความสัมพันธ์”

ใช้ +, -, *, /, //, %, ^ และตัวดำเนินการเปรียบเทียบได้อย่างมีประสิทธิภาพ คุณปฏิบัติ Lua Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Lua Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Lua Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

บทเรียน “ตัวดำเนินการเลขคณิตและความสัมพันธ์” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Lua Academy นี้ได้ไหม

ได้ บทเรียน Lua Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ภาพรวมชนิดข้อมูลของ Lua
  2. การประกาศตัวแปรใน Lua
  3. ตัวดำเนินการเลขคณิตและความสัมพันธ์
  4. การบังคับและการแปลงชนิดข้อมูล
← กลับไปที่ Lua Academy