ครับเป็นไงบ้างครับ
บางคนบอกวันนี้ผมเป็นไรป่าวมาแปลกๆ ให้ดูอะไรง่ายๆ ก็เห็นๆ กันอยู่ว่าประกาศตัวแปร
x เป็น float แล้วกำหนดค่าเริ่มต้นเป็น 100 ไง ส่วนบรรทัดที่ 2 ก็ประกาศ y เป็น
double แล้วหาผลลัพธ์ที่ได้จากการคูณ x กับ 3 แล้วเอามาบวกกับ 4 ไง ไม่เห็นมีอะไรแปลกเลยนี่
อืม...ครับผมก็ว่าไม่แปลกอะไรเลยถ้าเรามองแบบผ่านๆ แต่ในความเป็นจริงแล้วมีสิ่งที่ซ่อนเร้นอยู่นะครับ
ที่ผมบอกว่าเป็นกลไกของมัน ลองมาพิจารณาใหม่อีกทีนะครับ
float x = 100 ;
ผมถามท่านว่าตัวเลข 100 มี Type หรือชนิดเป็นอะไรครับ?
เราตอบได้ทันทีเลยครับว่า 100 เป็นจำนวนเต็มครับหรือมีชนิดเป็น
int นั่นเอง ส่วน x
เป็น float นะครับ
ตามที่เราประกาศไว้ จะเห็นว่าเมื่อพิจารณาดีๆ แล้วชนิดของตัวเลข 100 กับตัวแปร
x ไม่ตรงกันครับซึ่งจริงๆ แล้วมันจะผิดหลักนะครับ แต่เมื่อเรารันโปรแกรมจริงๆ แล้วจะไม่เกิดข้อผิดพลาดใดๆ
ให้เราเห็นครับ เพราะมันจะเกิดกลไกอย่างหนึ่งขึ้นมาโดยอัตโนมัติ คือ คอมไพเลอร์จะแปลงตัวเลข
100 ของเราให้เป็น float แล้วกำหนดค่าให้กับตัวแปร x เองโดยอัตโนมัติเลยครับ ดูอีกบรรทัดนะครับ
double y= x*3+4 ;
กำหนด y เป็นชนิด double แล้วลองพิจารณาดูนะครับว่า
3 และ 4 เป็น int ส่วน
x เป็น float มีค่าเท่ากับ
100 (จากบรรทัดที่ 1) เมื่อเราคอมไพล์โปรแกรม คอมไพเลอร์จะแปลงตัวเลข 3 กับ 4 และตัวแปร
x เป็น double แล้วทำการคูณและบวกตัวเลขเหล่านั้นแลัวนำมาเก็บไว้ที่ตัวแปร
y จะเห็นว่ากลไกเหล่านี้เกิดขึ้นเองโดยอัตโนมัติครับโดยคอมไพเลอร์จะจัดการให้เราเองซึ่งเราไม่ต้องไปกังวลเรื่องตัวแปรที่มีชนิดต่างกัน
มาดูตัวอย่างต่อไปครับ
เมื่อเราลองคอมไพล์ดูจะเห็นว่ามีข้อผิดพลาดเกิดขึ้นครับ
พอจะดูออกไหมครับว่าจุดไหนบ้าง? พิจารณาดูจะเห็นว่า x มีชนิดเป็น
double ครับแต่ว่าเรามาประกาศให้
y เป็น int ซะนี่ ส่วนอีกจุดหนึ่งก็คือ
ตัวเลข 4.0 มันเป็น float แน่ๆ
เห็นไหมครับว่าเกิดข้อขัดแย้งกันโดยสิ้นเชิง เนื่องจากมันไม่สามารถแปลงชนิดของตัวแปรหรือตัวเลขที่มีชนิด
ใหญ่ไปสู่ตัวแปรหรือตัวเลขที่มีชนิดเล็กกว่าได้นั่นเองครับ ซึ่งผิดกับตัวอย่างในตอนแรกที่ผมให้ดู
ข้อสังเกต ตัวอย่างในตอนแรก
y เป็น double ส่วน x เป็น float และตัวเลข 3 กับ 4 เป็น int ซึ่งมีชนิดที่เล็กกว่า
y แน่นอนดังนั้นการคอมไพล์จึงไม่เกิดข้อผิดพลาด ส่วนในตัวอย่างต่อมา y เป็น int
ส่วน x เป็น double และตัวเลข 3 เป็น int ตัวเลข 4.0 เป็น float ซึ่งมีชนิดทีใหญ่กว่า
y ครับ จึงเกิดข้อผิดพลาด