ต่อจาก บทความ ตัวดำเนินการ ภาษาซ๊ 2 นะครับในครั้งที่แล้วผมได้อธิบายเกียว กับระดับความสำคัญของ โอเปอเรเตอร์ ของภาษาซี ไปแล้วนะครับ คนที่ยังไม่ได้อ่านก็เข้าไปอ่านได้ที่ ตัวดำเนินการ ภาษาซี 2 เลยนะครับ คราวนี้ก็ยังอยู่ในเรื่อง ตัวดำเนินการ ภาษาซี เช่นเคยนะครับแต่คราวนี้ผมจะ อธิบายเกียวกับ การแปลงชนิดข้อมูล ในบทของ ตัวดำเนินการ ภาษาซี 2 ภาษาซีนะครับจะเห็นได้ว่า โอเปอเรเตอร์ก็จะมีลำดับความสำคัญ ใช่ใหมครับ เจ้านี้ก็มีเช่นกันแต่เรียนกกันว่า นัยสำคับ ระบบการทำงานในการแปลงชนิดข้อมูลนั้นก็ต้องเป็นไปตามระดับเช่นกัน แต่ว่าชนิดข้อมูลอะไรมี นัยสำคัญมากกว่ากัน เรา ไปศึกษาพร้อมกันเลยครับ
การแปลงชนิดข้อมูล จากบทความ ตัวดำเนินการ ภาษาซี 2 นิพจน์ที่แสดงให้เห็นนั้นจะเป็นนิพจน์ที่มีชนิดข้อมูลเดียวกันทั้งหมด แต่อันที่จริงนั้น นิพจน์สามารถประกอบด้วยชนิดข้อมูลที่แตกต่างกันได้ เรียกกันว่า mixed type expression แต่หลักการทำงานของโอเปอเรเตอร์นั้น โอเปอแรนด์ที่นำมาดำเนินการด้วยโอเปอเรเตอร์หนึ่งๆต้องมีชนิดข้อมูลที่เหมือนกัน ดังนั้นภาษาซีจึงมีกฎที่จะใช้จัดการกับนิพจน์เหล่านั้นอยู่2ประเภท คือ implicit type conversion และ explicit type conversion
implicit type conversion หมายความว่า คอมไพเลอร์จะทำการแปลงชนิดข้อมูลให้อยู่ในรูปแบบที่เหมาะสมโดยอัตโนมัติ ซึ่งกฎการแปลงชนิดข้อมูล ดูจากตารางข้างล่างนี้
ชนิดของข้อมูล | |
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 ความคิดเห็น:
แสดงความคิดเห็น