C / C ++ में वर्ण का आकार ('a')


298

C और C ++ में चरित्र का आकार क्या है? जहाँ तक मुझे पता है कि C और C ++ दोनों में char का आकार 1 बाइट है।

सी में:

#include <stdio.h>
int main()
{
    printf("Size of char : %d\n", sizeof(char));
    return 0;
}

C ++ में:

#include <iostream>
int main()
{
    std::cout << "Size of char : " << sizeof(char) << "\n";
    return 0;
}

कोई आश्चर्य की बात नहीं, दोनों ही आउटपुट देते हैं: Size of char : 1

अब हम जानते हैं कि पात्रों के रूप में प्रतिनिधित्व कर रहे हैं 'a', 'b', 'c', '|', ... तो मैं तो बस इन करने के लिए उपरोक्त कोड संशोधित:

सी में:

#include <stdio.h>
int main()
{
    char a = 'a';
    printf("Size of char : %d\n", sizeof(a));
    printf("Size of char : %d\n", sizeof('a'));
    return 0;
}

आउटपुट:

Size of char : 1
Size of char : 4

C ++ में:

#include <iostream>
int main()
{
    char a = 'a';
    std::cout << "Size of char : " << sizeof(a) << "\n";
    std::cout << "Size of char : " << sizeof('a') << "\n";
    return 0;
}

आउटपुट:

Size of char : 1
Size of char : 1

sizeof('a')C और C ++ में अलग-अलग मान क्यों देता है?


8
"%|"प्रारूप एक की आवश्यकता है intतर्क (या कुछ है कि को बढ़ावा देता है int)। sizeofप्रकार का परिणाम देता है size_t। या तो intकास्ट का उपयोग करने के लिए कनवर्ट करें या, यदि आपका कार्यान्वयन इसका समर्थन करता है, तो उपयोग करें "%zu"
कीथ थॉम्पसन

जवाबों:


348

सी में, एक चरित्र के प्रकार निरंतर की तरह 'a'वास्तव में एक है int, (या कुछ अन्य कार्यान्वयन पर निर्भर मूल्य) 4 के आकार के साथ। C ++ में, प्रकार char1 के आकार के साथ है। यह दो भाषाओं के बीच कई छोटे अंतरों में से एक है।


12
सी ++ मानक में यह धारा २.१३.२ / १, सी ६.४.४.४ में, कम से कम मुझे जो डॉक्स मिला है।

14
+1 (इसके अलावा, जबकि "4 का आकार" स्पष्ट रूप से nthrgeek के प्लेटफ़ॉर्म पर लागू होता है, यह आवश्यक रूप से सभी प्लेटफार्मों पर लागू नहीं होता है।)
sbi

28
@nthrgeek: मैं दोनों मानकों को उद्धृत करने के लिए बहुत आलसी हूं, लेकिन C ++ मानक में सी के साथ असंगतताओं के लिए समर्पित परिशिष्ट है। परिशिष्ट C.1.1 के तहत, यह उल्लेख करता है कि "चरित्र का प्रकार शाब्दिक से बदल दिया गया intहै char, जो व्यवहार की व्याख्या करता है। :)
जल्प

3
@nthrgeek: .46.4.4.4, पैराग्राफ 10: "एक पूर्णांक वर्ण स्थिरांक का प्रकार int है। एकल वर्ण बाइट के निष्पादन वाले नक्शे पर एकल वर्ण वाले निरंतर पूर्णांक वर्ण मान का मान मैप के प्रतिनिधित्व का संख्यात्मक मान है। चरित्र को पूर्णांक के रूप में व्याख्यायित किया गया। "
स्टीफन कैनन

7
@nthrgeek: आपको एक मानक संदर्भ के लिए नहीं पूछना चाहिए जब तक कि आप एक विशिष्ट बिंदु के बारे में तर्क नहीं दे रहे हैं और आप समझना चाहते हैं कि दूसरे व्यक्ति की राय अलग क्यों है। अगर हर कोई सहमत है तो बस इसे स्वीकार करें। आप (एक डेवलपर के रूप में) अपने आप से इस तरह के सामान्य उत्तर को जल्दी से खोजने के लिए काफी बुद्धिमान होना चाहिए।
मार्टिन यॉर्क

26

जैसा कि पॉल ने कहा, यह इसलिए 'a'है क्योंकि intसी में ए है लेकिन एchar C में A C ++ में।

मैं उस विशिष्ट अंतर को C और C ++ के बीच कवर करता हूं, जिसमें मैंने कुछ साल पहले लिखा था: http://david.tribble.com/text/cdiffs.htm


4
बस जिज्ञासु, लेकिन क्या आप C ++ 11 और C11 में नए बदलावों को शामिल करने के लिए (बहुत विस्तृत) डॉक्टर को अपडेट करने पर काम कर रहे हैं?
एडम रोसेनफील्ड

इस क्षण नहीं। C और C ++ में मेरी रुचि पिछले पांच वर्षों में बहुत कम हुई है।
डेविड आर ट्रिब्बल

3
उह, मैं अपने काम के लिए इस्तेमाल किया लिखने के लिए इस और यहां आप इतने पर कर रहे हैं। इतनी छोटी सी दुनिया!

17

सी में चरित्र के प्रकार शाब्दिक हैं सी + + में इंट और चार । यह फ़ंक्शन लोडिंग का समर्थन करने के लिए आवश्यक C ++ में है । इस उदाहरण को देखें:

void foo(char c)
{
    puts("char");
}
void foo(int i)
{
    puts("int");
}
int main()
{
    foo('i');
    return 0;
}

आउटपुट:

char

5

सी भाषा में , चरित्र शाब्दिक एक charप्रकार नहीं है । C वर्ण शाब्दिक को पूर्णांक मानता है। इसलिए, sizeof('a')और इनमें कोई अंतर नहीं है sizeof(1)

तो, आकार का वर्ण शाब्दिक C में आकार के पूर्णांक के बराबर है।

C ++ भाषा में , अक्षर शाब्दिक प्रकार है charCppreference कहते हैं की:

1) संकीर्ण चरित्र शाब्दिक या साधारण चरित्र शाब्दिक, जैसे 'a'या '\n'या '\13'। इस तरह के शाब्दिक प्रकार केchar और निष्पादन मूल्य सेट में सी-चार के प्रतिनिधित्व के बराबर मूल्य है। यदि सी-चार निष्पादन चरित्र सेट में एकल बाइट के रूप में प्रतिनिधित्व करने योग्य नहीं है, तो शाब्दिक का प्रकार इंट और कार्यान्वयन-परिभाषित मूल्य है।

तो, सी ++ में चरित्र शाब्दिक का एक प्रकार है char। इसलिए, C ++ में वर्ण शाब्दिक का आकार एक बाइट है।

Alos, अपने कार्यक्रमों में, आपने sizeofऑपरेटर के लिए गलत प्रारूप विनिर्देशक का उपयोग किया है ।

C11 .27.21.6.1 (P9):

यदि कोई रूपांतरण विनिर्देश अमान्य है, तो व्यवहार अपरिभाषित है .275) यदि कोई तर्क संगत रूपांतरण विनिर्देश के लिए सही प्रकार नहीं है, तो व्यवहार अपरिभाषित है।

तो, आपको %zuइसके बजाय प्रारूप विनिर्देशक का उपयोग करना चाहिए %d, अन्यथा यह सी में अपरिभाषित व्यवहार है।


%zuकई प्लेटफार्मों पर समर्थित नहीं है, लेकिन बेहतर पोर्टेबिलिटी, उपयोग (int)sizeof(char)और प्रारूप%d
chqrlie

वर्ण शाब्दिक का मान आवश्यक रूप से संबंधित ASCII कोड नहीं है। यह स्रोत और निष्पादन चरित्र सेटों पर निर्भर करता है और चाहे charप्रकार हस्ताक्षरित हो या डिफ़ॉल्ट रूप से अहस्ताक्षरित।
चकरली
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.