|
Character Constant
entry นี้เป็นเรื่องของ character constant ครับ
คนเขียนภาษา 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'; จะทำให้เข้าใจได้ง่ายกว่า
นอกจาก ตัวอักษรหนึ่งตัวระหว่างเครื่องหมาย ' แล้ว เรายังสามารถใส่ escape code สำหรับค่าที่ ไม่สามารถ หรือ ไม่สะดวก ในการเขียนลงใน source code การใส่ escape code ก็ใช้เครื่องหมาย \ แล้วตามด้วย character ตาม table

escape code ด้านบนมีเรื่องน่าสนใจอยู่หลายเรื่อง
เรื่องแรกคือ octal number \ooo octal number คือเลขฐานแปด o คือตัวเลข 0 ถึง 7 \ooo หมายถึงมีเลขฐานแปดได้ 1 หรือ 2 หรือ 3 ตัว เช่น '\7' หมายถึงค่า 7 '\10' หมายถึงค่า 8 (10 ฐานแปด คือ 8 ในฐานสิบ) '\377' หมายถึงค่า 255 (377 ฐานแปด คือ 255 ในฐานสิบ) แต่ '\09' จะเป็น multi-character constant คือมี 2 character เพราะ 9 ไม่ใช่เลขฐานแปด character ตัวแรกคือ '\0' และตัวที่สองคือ '9'
เรื่องต่อมาคือ hex number \xhh hex number คือเลขฐานสิบหก h คือตัวเลข 0 ถึง 9 และ A ถึง F หรือ a ถึง f \xhh หมายถึงมี hex number ตั้งแต่หนึ่งตัวขึ้นไป ไม่จำกัดว่ามากสุดต้องเป็นสองตัว
แต่จำกัดที่ค่าครับ
ทั้ง octal number และ hex number ต้องมีค่าไม่เกิน ค่าที่จะเก็บได้ใน unsigned char พูดง่ายๆคือ อย่าให้เกินค่าสูงสุดของ unsigned char ค่าสูงสุดของ unsigned char ดูได้จาก UCHAR_MAX ซึ่ง define อยู่ใน header file limits.h หาก character constant มีค่าเกิน UCHAR_MAX จะถือว่าเป็น undefined behavior คือปล่อยให้ compiler ตัดสินเองว่าจะทำยังไง
เรื่องต่อมาคือ ตัวอักษรที่ตามหลังเครื่องหมาย \ ต้องเป็นไปตามที่มีใน table ด้านบนเท่านั้น ถ้ามีตัวอื่น เช่น
n = '\c'; x = '\=';
จะถือว่าเป็น undefined behavior ปล่อยให้ compiler ตัดสินเอง อีกแล้ว
เรื่องต่อมาคือ ? กับ " สำหรับ character constant สองตัวนี้ดูเหมือนจะเป็น option คือจะมีเครื่องหมาย \ หรือไม่มีก็ได้ เช่น c = '\?'; จะเหมือนกับ c = '?'; และ c = '\"'; จะเหมือนกับ c = '"'; ซึ่งดูเหมือนไม่มีประโยชน์
แล้วกำหนดขึ้นมาทำไม คำตอบคือ " จะใช้กับ string constant ซึ่งจะได้อธิบายในโอกาสต่อไป ส่วน ? จะใช้ในเรื่อง trigraph
trigraph คืออะไร
ระบบ computer บางระบบมี character set จำกัดมาก (เดี๋ยวนี้คงหาดูยากแล้ว) ไม่มี character สำหรับเครื่องหมายพวกนี้ # ^ [ ] | { } ~ หรือบางทีไม่มีวิธีจะ key หรือ input character พวกนี้
แล้วจะเขียนโปรแกรมภาษา C กันยังไง ก็เลยกำหนดให้เอา character 3 ตัวที่มีอยู่ มาใช้แทน character ที่ไม่มี หรือที่ key ไม่ได้ เรียก character 3 ตัวนี้ว่า trigraph (สาม graph) เวลาเขียนโปรแกรมก็ใช้ trigraph แทน หน้าตาของ trigraph จะเป็นแบบนี้

ประมาณว่ามีโปรแกรมแบบนี้ { char a[10]; a[0] = 1; } ก็ต้องเขียนเป็น ??< char a??(10??); a??(0??) = 1; ??>
ตอน compile โปรแกรม compiler จะทำการแปลง trigraph พวกนี้ ไปเป็น internal code หรือ internal character set ก่อน การแปลงจะทำเหมือน search and replace ตรงๆ ไม่มีการตีความอะไรทั้งสิ้น แล้วค่อย compile ตามปรกติต่อไป
ด้วยเหตุที่ trigraph จะขึ้นต้นด้วย ?? เสมอ หากเราไม่อยากให้ compiler เข้าใจผิดเกี่ยวกับ trigraph เวลาที่มี string constant หรือ character constant ก็ให้ใช้ \? แทน ? ก็จะไม่เคยเกิด ?? เลย เป็นการป้องกันความสับสนครับ
แต่โอกาสจะได้เจอ trigraph นี่ น้อยมาก เรียกว่า ได้ยินแต่ชื่อ ไม่เคยเห็นตัวเป็นๆ ครับ
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 ได้เหมือนกัน
เห็นไหมครับว่า character constant นี่ง่ายนิดเดียว

แก้ที่ผิด+ปรับข้อความ
Create Date : 06 กันยายน 2551 |
Last Update : 21 พฤษภาคม 2553 17:05:55 น. |
|
2 comments
|
Counter : 1912 Pageviews. |
 |
|
|
โดย: wdc IP: 124.121.190.22 วันที่: 9 พฤษภาคม 2553 เวลา:15:36:24 น. |
|
|
|
| |
|
|