ตัวดำเนินการเลขคณิตและความสัมพันธ์
ใช้ +, -, *, /, //, %, ^ และตัวดำเนินการเปรียบเทียบได้อย่างมีประสิทธิภาพ
ตัวดำเนินการเลขคณิตและความสัมพันธ์ เป็นบทเรียน 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เป็นค่าเท็จ มิฉะนั้นจะคืนค่าba 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ภาพรวมชนิดข้อมูลของ Lua
- การประกาศตัวแปรใน Lua
- ตัวดำเนินการเลขคณิตและความสัมพันธ์
- การบังคับและการแปลงชนิดข้อมูล