เรื่องที่อยากเขียน ... เรื่องที่พยายามเขียน ...
Group Blog
 
All blogs
 
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 : 1715 Pageviews.

 
ขอบคุณมากที่นำความรู้มาแบ่งปันกันค่ะ เข้าใจเลย!


โดย: wdc IP: 124.121.190.22 วันที่: 9 พฤษภาคม 2553 เวลา:15:36:24 น.  

 


โดย: สมาชิกหมายเลข 6231806 วันที่: 15 พฤษภาคม 2566 เวลา:10:55:05 น.  

ชื่อ :
Comment :
  *ใช้ code html ตกแต่งข้อความได้เฉพาะสมาชิก
 

zkaru
Location :
กรุงเทพฯ Thailand

[Profile ทั้งหมด]

ฝากข้อความหลังไมค์
Rss Feed
Smember
ผู้ติดตามบล็อก : 2 คน [?]




เรื่องที่อยากเขียน ... เรื่องที่พยายามเขียน ...
Friends' blogs
[Add zkaru's blog to your web]
Links
 

 Pantip.com | PantipMarket.com | Pantown.com | © 2004 BlogGang.com allrights reserved.