Switch Statement
จิราพัชร เวชพะพา 650710533
Switch Statement เป็นคำสั่ง selection แบบ multiple-way selection คือ เป็นคำสั่งที่ใช้ในการเลือกทำในเงื่อนไขที่ต้องการจากหลายๆเงื่อนไข ซึ่งจะมีลักษณะคล้ายกับ if-else-if ladder Statement
Flow Diagram :
จากรูปการทำงานของ Switch Statement จะเริ่มจากการเช็คเงื่อนไขว่า Expression ตรงกับ case ใด จากนั้นจึงทำงานตาม code block ของ case นั้น แต่หากไม่ตรงกับ case ใดเลย ก็จะทำที่ default แทน แต่หากไม่มี default ก็จะไม่ทำงานใดๆ
Syntex :
ใน C# คำสั่ง Switch Statement ใช้ Keyword ว่า "switch" และตามด้วย "( Expression )" โดย Type ที่ Expression สามารถใช้ได้คือ int, char, string, byte, short และ enumeration จากนั้นตามด้วย "{ }" โดยจะใส่ case และ default ไว้ข้างใน "{ }" และในแต่ละเงื่อนไขต้องใส่ "break" เพื่อหยุดการทำงานด้วย หากไม่ใส่จะทำงาน block ที่อยู่ข้างล่างของเงื่อนไขไปเรื่อยๆจนจบ หรือจนกว่าจะเจอ"break"
ตัวอย่าง :
จาก code ระบบจะทำการรับค่า int มาหนึ่งค่าชื่อ "num" และทำการเช็คเงื่อนไขว่าตรงกับ case ใด หาก "num" มีค่าเท่ากับ 10 จะทำ case ที่ 1 คือพิมพ์ "It is 10" หาก "num" มีค่าเท่ากับ 20 จะทำ case ที่ 2 คือพิมพ์ "It is 20" และ หาก "num" มีค่าเท่ากับ 30 จะทำ case ที่ 3 คือพิมพ์ "It is 30" แต่ถ้า "num" ไม่เท่าค่าใดใน case เลยจะทำที่ default คือคือพิมพ์ "Not 10, 20 or 30"
ตัวอย่างผลลัพธ์ :
ตัวอย่าง :
จาก code สังเกตว่ามี "break" อยู่แค่ที่ case "Data Types", case "Jump Statements", case "Constructors" และ "default" เท่านั้น จะทำให้ "topic" ที่มีค่าเป็น "Inheritance" จะตรงกับ case "Inheritance" และทำงานที่นี่แต่ case "Inheritance ไม่มี "break" จึงลงไปทำงานที่ case "Constructors" ด้วยถึงจะเจอ "break" และหยุดการทำงาน
ผลลัพธ์ :
Switch&Goto :
ใน Switch Statement สามารถใช้ goto แทน break เพื่อส่งไปทำงานใน case อื่นที่ต้องการได้
ตัวอย่าง :
สังเกตจาก code จะมีการใช้ goto แทน break เพื่อย้ายไปทำใน case ที่ต้องการ
ผลลัพธ์ :
สังเกตว่าเมื่อทำใน case ที่ 2 เสร็จจะไปทำงานใน case ที่ 3 ต่อและเมื่อทำใน case ที่ 3 เสร็จจะไปทำงานใน default ต่อและเมื่อทำใน default เสร็จก็จะหยุดการทำงาน
Case guards :
เป็นการเพิ่มเงื่อนไขใน case โดยใช้ Keyword ว่า " when " โดยเงื่อนไขที่เพิ่มเข้ามาจะต้องเป็นค่าความจริง (boolean expression) เท่านั้น
ตัวอย่าง :

จาก code สังเกตว่า DisplayMeasurements(3, 4) มีค่า a = 3 และ b = 4
เช็คเงื่อนไขที่ 1 คือ a > 0 และ b > 0 เป็นจริง แต่ a ไม่เท่ากับ b จึงไม่ตรงเงื่อนไข
เช็คเงื่อนไขที่ 2 คือ a > 0 และ b > 0 เป็นจริง โดย a ไม่จำเป็นเท่ากับ b จึงตรงเงื่อนไข
และพิมพ์ "First measurement is 3, second measurement is 4." ออกมา
และ DisplayMeasurements(5, 5) มีค่า a = 5 และ b = 5
เช็คเงื่อนไขที่ 1 คือ a > 0 และ b > 0 เป็นจริง และ a = b จึงตรงเงื่อนไข
และพิมพ์ "Both measurements are valid and equal to 5." ออกมา
ผลลัพธ์ :
เปรียบเทียบกับภาษา Java/C/Python :
C :
Syntex :
สังเกตว่า syntex ของ C และ C# แทบไม่แตกต่างกันเลยแต่ Expression ของ C นั้นจะเป็นได้แค่ int และ char เท่านั้นและ C ไม่มีคำสั่ง goto กับการทำ Case guards ส่วนหลักการทำงานอื่นๆเหมือนกับ C# เลยเพราะ C# ถูกพัฒนามาจาก C
ตัวอย่าง :
สังเกตว่า "var" เท่ากับ 1 ตรงกับ case 1 จึงทำการพิมพ์ "Case 1 is Matched." และจบการทำงานเมื่อเจอ "break"
ผลลัพธ์ :
ตัวอย่าง :
สังเกตว่า "var" เท่ากับ 2 ตรงกับ case 2 จึงทำการพิมพ์ "Case 2 is executed." แต่ไม่มี "break" จึงทำใน case 3 แล้วก็ทำใน case 4 ต่อเพราะทั้งใน case 3 และ case 4 ไม่มี "break" และเมื่อทำ case 4 เสร็จถึงจบการทำงานเพราะไม่มี case ให้ทำงานต่อแล้ว
ผลลัพธ์ :
Java :
Syntex :

สังเกตว่า syntex ของ Java และ C# แทบไม่แตกต่างกันเลยแต่ Expression ของ Java จะมีค่าเป็นได้คือ int, short, char, byte, enumerated, String class, Integer, Short, Character and Byte และ Java ไม่มีคำสั่ง goto กับการทำ Case guards ส่วนหลักการทำงานอื่นๆเหมือนกับ C และ C#
ตัวอย่าง :
สังเกตว่าหลักการทำไม่ต่างอะไรกับ C และ C# เลยคือเช็คว่า expression ตรงกับ case ใดและทำงานใน case นั้นในที่นี้คือ "levelString" ซึ่งทีค่าเป็น 0 ทำให้ "level" เท่ากับ 0 และพิมพ์ผลลัพธ์ดังนี้
ผลลัพธ์ :
ตัวอย่าง :
สังเกตว่า "number" เท่ากับ 20 จึงทำงานใน "case 20" พิมพ์ "20" ออกมาแต่ไม่มี "break" จึงทำ case ที่อยู่ข้างล่างด้วยผลลัพธ์จึงออกมาดังนี้
ผลลัพธ์ :
Python :
ใน Python ไม่มี Switch Statement เหมือนกับ C C# และ Java แต่มี Match Case Statement ที่ทำหน้าที่คล้ายกับ Switch Statement หรือจะใช้ if-elif-else และ Dictionary Mapping แทนก็ได้
ตัวอย่างการใช้ if-elif-else แทน :
ผลลัพธ์ :
ตัวอย่างการใช้ Dictionary Mapping แทน :
ผลลัพธ์ :
Match Case Statement :
Match Case Statement เปรียบเสมือน Switch Statement ใน Python
Syntex :
Syntex ของ Match Case Statement ต่างกับ Switch Statement ตรงที่ใช้ Keyword "match" แทน "switch " ใช้ "case other" หรือ "case _" แทน "default" ในส่วนเงื่อนไขไม่ต้องใส่ 'break" เพราะเมื่อทำงานในเงื่อนไขเสร็จก็จะจบการทำงานของ Match Case Statement เอง และ "expression" ของ Match Case Statement สามารถเป็นได้หลากหลายแบบ
ตัวอย่าง :
สังเกตว่า expression หรือในที่นี้คือ "num" เป็นค่าที่รับเข้ามา เพื่อเช็คว่าตรงกับ case ใดและทำงานใน case นั้นแต่ในทุก case ไม่ต้องมี "break" เพื่อหยุดการทำงาน
ผลลัพธ์ :
ตัวอย่าง :
สังเกตในตัวอย่างที่แล้วใช้ "case _" แต่ตัวอย่างนี้ใช้ "case other" เนื่องจาก 2 อย่างนี้ใช้แทนกันได้
ตัวอย่าง :
สังเกตว่าตัวอย่างนี้มีการใช้ if ใน expression เพื่อเช็คเงื่อนไขคือ ถ้า "num" มากกว่า 0 พิมพ์ "Positive" หาก "num" น้อยกว่า 0 พิมพ์ "Negative" แล้วถ้าไม่ตรงเงื่อนไขไหนเลยพิมพ์ "Zero"
ผลลัพธ์ :
ตัวอย่าง :
สังเกตว่า expression ในตัวอย่างเป็น Dictionary โดยมีเงื่อนไขคือถ้าใส่ "name" กับ "age" จะพิมพ์ "name" กับ "age" หากใส่ "name" กับ "salary" จะพิมพ์ "name" กับ "salary" แต่หากไม่ตรงเงื่อนไขไหนเลยจะพิมพ์ "Data does not exist"
ผลลัพธ์ :
สรุป : Switch Statement ใน C C# Java มี Syntex และหลักการทำงานเหมือนกัน แต่มี Type ของ Expression ที่สามารถเป็นได้แตกต่างกัน ส่วนใน Python ไม่มี Switch Statement แต่มี Match Case Statement ที่มีหลักการทำงานคล้ายกันแทน
อ้างอิง :
C# :
C :
Java :
Python :
slides : https://drive.google.com/drive/folders/1hkKg0mcymAIP1E4b0icb8HEtiI7y29RG?usp=sharing
clip : https://youtu.be/zBagUwfaVq8
Last updated