คนเขียนภาษา C ต้องรู้จัก character constant ดีกันทุกคน เพราะต้องเคยเขียนและคุ้นเคยกันมาตั้งแต่โปรแกรมแรกๆแล้ว น่าจะเป็นเรื่องง่ายๆ ลองมาดูว่า เรื่อง character constant จะง่ายแค่ไหน
character constant แปลตรงตัวคือ ค่าคงที่แบบตัวอักษร มีทั้งแบบ character ธรรมดา หนึ่ง character ใช้หนึ่ง char หรือหนึ่ง byte ในการเก็บ หรือแบบ wide character หนึ่ง wide character จะใช้หนึ่ง wchar_t ซึ่งมีขนาดหลาย byte ในการเก็บ wchar_t จะเป็นกี่ byte ต้องไปดูใน header file stddef.h
ที่พูดไปเป็นแบบ single character constant นะครับ ยังมีแบบ multi-character constant ให้ปวดหัวอีก
อย่างไรก็ตาม ที่ใช้กันมากที่สุด จะเป็นแบบ single character constant แบบ char ธรรมดา ใน entry นี้เลยจะพูดถึง character constant แบบนี้
รูปแบบของ single character constant จะมีตัวอักษรหนึ่งตัวอยู่ระหว่างเครื่องหมาย ' (apostrophe) สองตัว เช่น 'a', 'A', '0' เป็นต้น ความหมายของค่าคงที่เหล่านี้ ก็คือค่าของ ตัวอักษร ที่อยู่ระหว่างเครื่องหมาย ' นั่นเอง
เช่น ตัวอักษร a เล็ก ในระหัส ASCII มีค่าเป็น 97 หรือ 0x61 ดังนั้น 'a' ก็คือค่า 97 หรือ 0x61 นั่นเอง แทนที่จะเขียนใน source code เป็น int c = 97; ซึ่งอ่านแล้วไม่รู้ว่า 97 เป็นค่าอะไร ก็เขียนเป็น int c = 'a'; จะทำให้เข้าใจได้ง่ายกว่า
เรื่องต่อมาคือ hex number \xhh hex number คือเลขฐานสิบหก h คือตัวเลข 0 ถึง 9 และ A ถึง F หรือ a ถึง f \xhh หมายถึงมี hex number ตั้งแต่หนึ่งตัวขึ้นไป ไม่จำกัดว่ามากสุดต้องเป็นสองตัว
character constant นี่ชื่อเป็น character ก็จริง แต่มี type เป็น int นะครับ ดูตัวอย่างโปรแกรม
#include <stdio.h> int main() { printf("%d\n",sizeof('a')); return 0; }
โปรแกรมด้านบน ตั้งชื่อเป็น t1.c ไป compile ด้วย Microsoft VC++ เวลารันจะได้ผลลัพธ์เป็น 4 เพราะ sizeof('a') ก็คือ sizeof(int) นั่นเอง ซึ่ง int บน windows 32 bits มีขนาดเป็น 4 bytes
แต่ถ้าเป็นภาษา C++ character constant จะมี type เป็น char ครับ ดังนั้น โปรแกรมเดียวกัน ปรับเป็น C++ ซักหน่อย โดยตั้งชื่อเป็น t2.cpp ไป compile ด้วย Microsoft VC++ ตัวเดิม เวลารันจะได้ผลลัพธ์เป็น 1 เพราะ sizeof('a') จะเป็น sizeof(char) ซึ่งมีขนาดเป็น 1 byte
อันนี้เป็นข้อแตกต่างที่สำคัญ ระหว่างภาษา C กับ C++ ต้องระวังหน่อยนะครับ อย่าให้ compiler หลอกเอาได้ ท่องไว้เลยครับ C ไม่เท่ากับ C++ C ไม่เท่ากับ C++ C ไม่เท่ากับ C++ C ไม่เท่ากับ C++ C ไม่เท่ากับ C++ C ไม่เท่ากับ C++
สรุปว่าเรื่อง character constant ที่น่าจะคุ้นเคยกันดี เพราะใช้กันมานาน เขียนกันมานาน ก็อาจจะผิดพลาด เพราะไม่เข้าใจข้อกำหนดของ standard C ได้เหมือนกัน