19 มี.ค. 2022 เวลา 09:33 • การศึกษา
004: Boolean ในภาษา C กับภาษา Java
ชนิดข้อมูลแบบ boolean หมายถึงชนิดข้อมูลที่ใช้แทนค่าความจริง-เท็จ ซึ่งจะมีค่าที่เป็นไปได้แค่สองค่าคือ true กับ false
ในการเขียนลูปไม่รู้จบ (infinite loop) ด้วย while loop
ในภาษา Java จะเขียนในลักษณะนี้
while(true)
doSomething();
ในภาษาซี จะเขียนในลักษณะนี้
while(1)
doSomething();
เนื่องจากในภาษาซี ไม่มีชนิดข้อมูลแบบ boolean ภาษาซีจึงกำหนดให้ใช้ตัวเลขจำนวนเต็มแทนความหมายของค่าความจริง-เท็จได้ กล่าวคือ:
ภาษาซีกำหนดให้
  • 0 หมายถึง "เท็จ"
  • ค่าใดๆ ที่ไม่ใช่ 0 หมายถึง "จริง"
โดยการตีความตัวเลขเป็นค่าความจริง-เท็จนี้ จะเกิดขึ้น ณ จุดที่ต้องการค่า boolean เช่น ที่เงื่อนไขของ loop หรือเงื่อนไขของ if
ตัวอย่างเช่น เมื่อต้องการให้ while loop ทำงานไม่รู้จบ นั่นก็คือ while(true) แต่คำว่า true ไม่มีในภาษาซี จึงจะใช้ while(1) แทน หรือจะใช้เลขอื่นๆ แทนก็ได้ (ตราบใดที่ไม่ใช่เลข 0) เช่น ใช้ while(2) ก็ได้ ใช้ while(100) ก็ได้ ก็จะมีความหมายเดียวกัน คือวนลูปไปเรื่อยๆ
คำถามคือแล้วทำไมภาษา Java และภาษายุคหลัง ๆ จึงต้องมี boolean ? ทำไมจึงไม่ใช้วิธีเดียวกับภาษา C คือใช้ตัวเลขแทนค่าความจริงไปเลย ?
สาเหตุก็เพราะการใช้ตัวเลขแทนค่าความจริง อาจทำให้เกิดปัญหา เช่น
  • 1.
    อ่านโค้ดยาก ระหว่าง while(2) กับ while(true) ตัวหลังน่าจะเข้าใจมากกว่า
  • 2.
    มีโอกาสเขียนโค้ดแล้วเกิด bug โดยไม่ได้ตั้งใจ
เช่น if( a = 100) (จริงๆ ตั้งใจจะเขียน == คือเปรียบเทียบค่า a กับ 100)
ความหมายในภาษาซีกลายเป็น assign ค่า 100 ให้ a และเอาค่า a ไปทดสอบเงื่อนไข if ซึ่งค่า 100 แปลว่า true ก็จะได้ค่าจริงเสมอ
นี่จึงเป็นสาเหตุหลัก ๆ ที่ภาษาในยุคหลังจากภาษาซี มักมีชนิดข้อมูล boolean แยกต่างหากให้เลย เพื่อเป็นการลดการเกิด bug และอ่านโค้ดได้ง่ายขึ้นนั่นเอง
หมายเหตุ:
ในซี มีการแก้แบบ adhoc คือแก้แบบแค่ให้พอใช้งานได้ คือ define คำว่า TRUE กับ FALSE ไว้ใน stdio.h แต่อันที่จริง สองคำนี้ก็ยังแทนด้วยค่าตัวเลขอยู่ดี ดังนั้นแม้ว่าจะช่วยให้อ่านโค้ดง่ายขึ้นก็จริง แต่ก็ยังไม่ได้แก้ปัญหาเรื่อง bug ที่อาจเกิดจากการเขียนคำสั่งเช่น if(a=5) โดยไม่ได้ตั้งใจ
โฆษณา