ตัวดำเนินการ ภาษา c 3

Operator ลำดับการแปลงชนิดข้อมูล       ต่อจาก บทความ ตัวดำเนินการ ภาษาซ๊ 2 นะครับในครั้งที่แล้วผมได้อธิบายเกียว กับระดับความสำคัญของ โอเปอเรเตอร์ ของภาษาซี ไปแล้วนะครับ คนที่ยังไม่ได้อ่านก็เข้าไปอ่านได้ที่ ตัวดำเนินการ ภาษาซี 2 เลยนะครับ  คราวนี้ก็ยังอยู่ในเรื่อง ตัวดำเนินการ ภาษาซี เช่นเคยนะครับแต่คราวนี้ผมจะ อธิบายเกียวกับ การแปลงชนิดข้อมูล ในบทของ ตัวดำเนินการ ภาษาซี 2 ภาษาซีนะครับจะเห็นได้ว่า โอเปอเรเตอร์ก็จะมีลำดับความสำคัญ ใช่ใหมครับ เจ้านี้ก็มีเช่นกันแต่เรียนกกันว่า นัยสำคับ ระบบการทำงานในการแปลงชนิดข้อมูลนั้นก็ต้องเป็นไปตามระดับเช่นกัน แต่ว่าชนิดข้อมูลอะไรมี นัยสำคัญมากกว่ากัน เรา ไปศึกษาพร้อมกันเลยครับ

การแปลงชนิดข้อมูล จากบทความ ตัวดำเนินการ ภาษาซี 2 นิพจน์ที่แสดงให้เห็นนั้นจะเป็นนิพจน์ที่มีชนิดข้อมูลเดียวกันทั้งหมด แต่อันที่จริงนั้น นิพจน์สามารถประกอบด้วยชนิดข้อมูลที่แตกต่างกันได้ เรียกกันว่า mixed type expression แต่หลักการทำงานของโอเปอเรเตอร์นั้น โอเปอแรนด์ที่นำมาดำเนินการด้วยโอเปอเรเตอร์หนึ่งๆต้องมีชนิดข้อมูลที่เหมือนกัน ดังนั้นภาษาซีจึงมีกฎที่จะใช้จัดการกับนิพจน์เหล่านั้นอยู่2ประเภท คือ implicit type conversion และ explicit type conversion

implicit type conversion หมายความว่า คอมไพเลอร์จะทำการแปลงชนิดข้อมูลให้อยู่ในรูปแบบที่เหมาะสมโดยอัตโนมัติ ซึ่งกฎการแปลงชนิดข้อมูล ดูจากตารางข้างล่างนี้

ชนิดของข้อมูล

ภาษา c

long double
double
float
unsigneed long int
long int
unsigned int
int
shot
char

ถ้าในนิพจน์หนึ่งประกอบด้วยชนิดข้อมูลหลายประเภท ภาษาซีจะทำการแปลงชนิดของข้อมูลให้โดยอัตโนมัติ โดยชนิดข้อมูลที่มีนัยสำคัญต่ำกว่าจะถูกแปลงไปเป็นชนิดข้อมูลที่มีนัยสำคัญที่สูงกว่าเสมอ เช่น ท่า A เป็น int แล้วนำมาบอกกับ B ที่เป็น float นั้นจะไม่สามารถทำการบวกได้ทันที เพราะชนิดข้อมูลของตัวแปรทั้งสองมันแตกต่างกันแต่ ภาษาซีจะทำ implicit type conversion โดยแปลงชนิดข้อมูลของตัวแปร A จาก int ไปเป็น float ให้ก่อน (เนื่องจาก float มีนัยสำคัญสูงกว่า int) แล้วจึงทำการบวกกันตามปกติ ซึ่งผลลัพธ์ก็จะออกมาเป็น float ครับ

ตารางข้างล่างนี้เป็นตัวอย่างของการทำงาน implicit type conversion นะครับ

นิพจน์ การแปลงชนิดข้อมูล
char + float แปลง char ไปเป็น float แล้วบวกตามปกติ ผลได้เป็น float
unsigned int - long in แปลง long in เป็น unsigned int แล้วก็ ลบ ปกติ ผลได้เป็น unsigned
float * doueble แปลง float เป็น doueble แล้วก็ คูณปกติ ผลได้เป็น doueble
( char+float )/double แปลง char ไปเป็น float แล้วบอก แล้วค่อย แปลง float ไปเป็น double ผลได้ double

ต่อไปก็ถึงตาของ explicit type conversion เรามาดูกันดีกว่าว่ามันคืออะไร

Explicit Type Conversion( Casting ) คือ การที่ผู้เขียนโปรแกรมทำการเปลียนแปลงชนิดข้อมูลจากชนิดหนึ่งไปเป็นอีกชนิดหนึ่งด้วยตัวเองโดยที่ คอมไพเลอร์ไม่ได้ทำการแปลงให้ การแปลงชนิดนี้ เรียกกันอีกอย่างว่า Casting หรือ สั้นๆว่า cast ซึ่งทำได้โดยการระบุชนิดข้อมูลปลายทางที่ต้องการในวงเล็บ แล้ววางไว้หน้านิพจน์ที่ต้องการแปลงชนิดข้อมูล

      (ชนิดขอลข้อมูลที่จะแปลงเป็น) นิพจน์ที่ต้องการแปลงชนิดข้อมูล
รูปแบบ
     

ตัวอย่างการทำ Explicit Type Conversion หรือ Casting

กำหนด    ตัวแปร a มีชนิดข้อมูลเป็น int
               ตัวแปร b มีชนิดข้อมูลเป็น int
               ตัวแปร c มีชนิดข้อมูลเป็น float

  • (float) a
    ความหมาย คือ ต้องการแปลงชนิดข้อมูลของตัวแปล a ที่เป็นชนิด int ให้เป็น float
  • (float)( a – b )
    ความหมาย คือ ในรูปแบบนี้มันจะการะทำการให้ a – b ก่อนแล้วจึงแปลงค่าเป็น float
  • c=(float) a /b
    ความหมาย คือ ทำการแปลงค่าตัวแปร a ไปเป็นชนิด floatโดยการที่เราทำ Casting แล้ว ตัวแปร a จะเป็น float แต่โปรแกรมมันก็ยังจะหารไม่ได้เลยที่เดียวเพราะ b ยังเป็น int อยู่ใช้ใหมครับ ทางโปรแกรมเลยกระทำการ implicit type conversion ให้กับเราอัตโนมัติ คือการเปลียน ชนิดข้อมูลของ ตัว b ให้ เป็นตาม กฎของ implicit type conversion  ที่ว่ากันว่า มันจะเปลี่ยนไปเป็นชนิดข้อมูลที่มีนัยสำคัญมากกว่า ในที่นี้คือ float เลยกระทำการเปรียนเป็น float ครับ และเมื่อ เปลี่ยนแล้วก็ จะทำการหารแล้วนำไปเก็บที่ตัวแปร c อีกต่อไป
  • (float)(a/10) กับ (float) a / 10
    สำหรับกรณีนี้ หากดูผิวเผินอาจจะคิอว่าทั้งสองนิพจน์นี้เหมือนกัน แต่ความจริงไม่ไม่ใช่นะครับ เพราะจะได้คำตอบที่แตกต่างกัน ในที่นี้ผู้เขียนอยากให้ ผู้อ่านลองนำตัวเลข สมมุติขึ้นมา 1 ตัวและก็ นำมาแทนในตัวแปร a ทั้งสองนิพจน์ข้องบนแล้วทำโดยวิธีที่เคยกล่าวมาทั้งหมด จะได้รู้ว่ามันต่างกันยังไง

ตารางเปรียบเทียบ ระหว่าง implicit type conversion กับ explicit type conversion

implicit type conversion
explicit type conversion
ข้อดี ไม่ต้องคำนึงถึงการแปลงชนิดข้อมูล เพราะ คอมไพเลอร์จะทำการแปลงให้โดยอัตโนมัติ ได้ชนิดข้อมูลตามที่เราต้องการ
ข้อเสีย คอมไพเลอร์จะทำการแปลงให้อาจไม่ได้ข้อมูลตามความต้องการ การแปลงชนิดนี้เราต้องทำเองท่าไม่รอบคอบจะทำให้ได้ผลลัพธ์ที่ได้มีค่าไม่ถูกต้อง กล่าวคือ วิธีนี้ง่ายต่อการเกิดข้อผิดพลาด

ในบทของ ตัวดำเนินการ ภาษาซี นี้บทนี้เป็นบทที่3 ได้กล่าวถึงเรื่อง การแปลงชนิดข้อมูล ผมจะขอจบไว้เท่านี้ก่อนนะครับ แล้วค่อยมาต่อที่บท ตัวดำเนิดการภาษาซี 4 กันนะครับโดยจะกล่าวในเรื่อง การดำเนินการทางตรรกะ ครับ สุดท้ายนี้หวังว่าบทความนี้จะช่วยผู้ที่เข้ามาอ่านเพื่อศึกษาภาษาซี ไม่มากก็น้อยนะครับ

0 ความคิดเห็น:

แสดงความคิดเห็น