C में मल्टी-कैरेक्टर कॉन्स्टेंट्स (जैसे 'AB', 'ABC') वैध हैं लेकिन इम्प्लीमेंटेशन-डिफाइंड व्यवहार दिखाते हैं। ये int टाइप के होते हैं।
उदाहरण
#include <stdio.h>
int main() {
printf("'A' = %d (0x%X)\n", 'A', 'A');
printf("'AA' = %d (0x%X)\n", 'AA', 'AA');
printf("'ABC' = %d (0x%X)\n", 'ABC', 'ABC');
printf("'ABCD' = %d (0x%X)\n", 'ABCD', 'ABCD');
return 0;
}
आउटपुट (लिटिल-एंडियन x86 पर सामान्य)
'A' = 65 (0x41) 'AA' = 16705 (0x4141) 'ABC' = 4276803 (0x414243) 'ABCD' = 1094861636 (0x41424344)
व्याख्या
- प्रत्येक कैरेक्टर एक बाइट ऑक्युपाई करता है।
- लिटिल-एंडियन में, पहला कैरेक्टर लोएस्ट बाइट में जाता है।
'AB'='A' | ('B' << 8)=0x41 | (0x42 << 8)=0x4241= 16961 (बिग-एंडियन) या 16705 (लिटिल-एंडियन)।- आकार:
sizeof('A') == sizeof(int)(C में), लेकिन C++ मेंsizeof('A') == sizeof(char)।
पोर्टेबिलिटी समस्या
- मान **इम्प्लीमेंटेशन-डिफाइंड** है (एंडियननेस,
intआकार पर निर्भर)। - पोर्टेबल कोड में **उपयोग न करें**।
- इसके बजाय स्ट्रिंग लिटरल्स
"AB"या एक्सप्लिसिट बिट ऑपरेशन्स उपयोग करें।
उपयोग के मामले (दुर्लभ)
- फोर-कैरेक्टर कोड्स (FourCC) - मल्टीमीडिया फॉर्मेट्स में (जैसे
'RIFF','AVI ')। - कंपाइल-टाइम कैरेक्टर कॉम्बिनेशन तुलना (केवल ज्ञात आर्किटेक्चर पर)।