2012-02-16 7 views
6

क्यों चरित्र कार्य चार तर्क के बजाय int तर्क स्वीकार करते हैं?एएनएसआई सी: क्यों चरित्र कार्य चार तर्क के बजाय int तर्क स्वीकार करते हैं?

<ctype.h> 

int isalnum(int c); 
int isalpha(int c); 
int iscntrl(int c); 
int isdigit(int c); 
int isgraph(int c); 
int islower(int c); 
int isprint(int c); 
int ispunct(int c); 
int isspace(int c); 
int isupper(int c); 
int isxdigit(int c); 
int tolower(int c); 
int toupper(int c); 
+0

मुझे लगता है इस सवाल का जवाब [यहां] दिए गए एक (http://stackoverflow.com/questions/433895/why-are-c-character-literals-ints-instead-of-chars) के समान है। सी में, चरित्र अक्षर 'int' प्रकार के होते हैं। –

+0

@ कोडी: दो निर्णय संबंधित हो सकते हैं, जिसमें सी में वर्णों पर "गणना" करने के लिए सही डेटाटाइप 'int' है। लेकिन इन कार्यों के पैरामीटर के समान अक्षर वाले अक्षर जितना आसान दिखते हैं उतना आसान नहीं है। आप 'इस्लामम (' ए ') लिख सकते हैं, लेकिन आपको' इस्लामम (CHAR_MIN) 'लिखने में सक्षम होने की गारंटी नहीं है, या आपके कार्यान्वयन में जो भी वर्ण शाब्दिक' CHAR_MIN' से मेल खाता है, क्योंकि यह नकारात्मक हो सकता है।इन कार्यों के साथ ठीक से मिलान करने के लिए, चरित्र अक्षर को वास्तव में 'हस्ताक्षरित' प्रकार की आवश्यकता होगी, लेकिन फिर उन्हें 'char' पर कास्टिंग करना संभवतः खराब होगा। –

उत्तर

9

वर्ण और पूर्णांकों बल्कि कसकर सी

में बुनी कर रहे हैं आप एक इनपुट स्ट्रीम से एक चरित्र प्राप्त करते हैं, यह हर एक चरित्र प्लस अंत फ़ाइल प्रतीक को प्रदर्शित करने में सक्षम होना चाहिए।

इसका मतलब है कि एक char प्रकार काफी बड़ा नहीं होगा तो वे एक व्यापक प्रकार का उपयोग करें।

C99 औचित्य दस्तावेज़ कहता है:

इन कार्यों के बाद से अक्सर, उनके डोमेन छोटे धनात्मक पूर्णांक के लिए प्रतिबंधित है EOF का मूल्य मुख्य रूप से मैक्रो के रूप में इस्तेमाल एक अहस्ताक्षरित चार में प्रदर्शनीय, प्लस कर रहे हैं। ईओएफ पारंपरिक रूप से -1 है, लेकिन यह कोई नकारात्मक पूर्णांक हो सकता है, और इसलिए किसी भी वैध चरित्र कोड से अलग है। इस प्रकार मैक्रोज़ को विशेष रूप से गुणों के एक छोटे सरणी में इंडेक्स के रूप में तर्क का उपयोग करके कार्यान्वित किया जा सकता है।

मानक ही इस में क्या कहना है:

हैडर <ctype.h> वर्गीकृत करने और मानचित्रण पात्रों के लिए उपयोगी कई कार्य की घोषणा की। सभी मामलों में तर्क एक int है, जिसका मान एक हस्ताक्षरित चार के रूप में प्रतिनिधित्व योग्य होगा या मैक्रो ईओएफ के मान के बराबर होगा। यदि तर्क का कोई अन्य मूल्य है, तो व्यवहार अपरिभाषित है।

+1

"अगला सबसे बड़ा प्रकार" वास्तव में 'छोटा' होगा। लेकिन, जब इन्हें 'शॉर्ट' का आविष्कार किया गया तो उन्हें 'char' की तरह 'int' में पदोन्नत किया जाएगा। –

+0

क्या एक बेवकूफ प्रोग्रामर ईओएफ को 'tolower' पास करता है? –

+0

@ जेरीकॉफिन आपका क्या मतलब है? सभी शॉर्ट्स अभी भी इनट्स में प्रचारित होते हैं, जब भी वे अभिव्यक्ति में उपयोग किए जाते हैं। – Lundin

3

वे सामान्य चरित्र मूल्यों के अलावा EOF स्वीकार करना होगा। वे फ़ंक्शन प्रोटोटाइप के आविष्कार की भी भविष्यवाणी करते हैं। उस समय, char को फ़ंक्शन में पास करने का कोई तरीका नहीं था - इसे हमेशा int पर प्रचारित किया गया था।

3

जब सी का पहली बार आविष्कार किया गया था, तो फ़ंक्शन तर्कों की कोई संकलन-समय जांच नहीं हुई थी। यदि एक foo(bar,boz), और bar कहा जाता है और boz प्रकार int के थे, संकलक स्टैक पर दो int मूल्यों धक्का होगा, foo कहते हैं, और आशा है कि यह दो int मूल्यों को प्राप्त करने के लिए उम्मीद कर रहा था। चूंकि अभिव्यक्तियों का मूल्यांकन करते समय int से अधिक पूर्णांक प्रकार int पर प्रचारित किए जाते हैं, इसलिए प्रोटोटाइप के आविष्कार से पहले लिखे गए कार्यों को कोई छोटा पूर्णांक प्रकार नहीं पारित किया जा सकता था।

0

हाँ, यह EOF जो हमेशा एक गैर चार मूल्य है समायोजित करने के लिए, हालांकि EOF का सही मूल्य विभिन्न प्रणालियों के साथ भिन्न हो सकता है, लेकिन यह किसी भी चरित्र कोड के रूप में ही कभी नहीं हो जाएगा हो सकता है।

संबंधित मुद्दे