सी में, तार चार (char *
) के सरणी हैं और वर्ण आमतौर पर char
में संग्रहीत होते हैं। मैंने देखा कि libC के कुछ फ़ंक्शन एक char के बजाय तर्क पूर्णांक के रूप में ले रहे हैं।क्यों पुचर, टॉपर, टोलर इत्यादि एक char के बजाय int int लेते हैं?
उदाहरण के लिए, चलिए toupper()
और tolower()
फ़ंक्शन लेते हैं जो दोनों int
का उपयोग करते हैं। मैन पेज कहता है:
यदि सी एक हस्ताक्षरित चार मान या ईओएफ नहीं है, तो इन कार्यों का व्यवहार अपरिभाषित है।
मेरा अनुमान है कि एक int
, toupper
और tolower
unsigned char
और EOF
के साथ सौदा करने में सक्षम हैं के साथ। लेकिन वास्तव में EOF
अभ्यास में है (क्या इसके मूल्य के बारे में कोई नियम है?) एक मान जिसे char
के साथ संग्रहीत किया जा सकता है, और चूंकि वे फ़ंक्शन EOF
को किसी और चीज़ में परिवर्तित नहीं करेंगे, मुझे आश्चर्य है कि toupper
क्यों नहीं लेता तर्क के रूप में एक char।
किसी भी मामले में हमें ऐसा कुछ स्वीकार करने की आवश्यकता क्यों है जो एक चरित्र नहीं है (जैसे ईओएफ)? क्या कोई मुझे एक प्रासंगिक उपयोग केस प्रदान कर सकता है?
यह fputc
या putchar
साथ इसी तरह की है, वह भी एक int
कि एक unsigned char
में वैसे भी बदल जाती है ले लो।
मैं उस विकल्प के लिए सटीक प्रेरणा की तलाश में हूं। मैं आश्वस्त होना चाहता हूं, मैं जवाब नहीं देना चाहता कि मुझे नहीं पता कि कोई मुझे एक दिन पूछता है या नहीं।
मैं किसी भी नियम है कि 'EOF' एक' char' में फिट करना चाहिए पता नहीं है, और मैं आपको विश्वास दिलाता कर सकते हैं कि 'char' जो' char' बजाय का उपयोग कर के बारे में अपने विचार-विमर्श करता है हस्ताक्षर किए जाने की गारंटी नहीं है, 'हस्ताक्षरित चार' का गलत लगता है। आप का मतलब है 'हस्ताक्षर चार' भर में। –
क्या आपने इन कार्यों के कार्यान्वयन को देखा था। मुझे लगता है कि 'int' पैरामीटर ऑप्टिमाइज़ेशन उद्देश्यों के लिए है, क्योंकि इसके बाइट आकार प्रोसेसर रजिस्टरों के आकार के लिए उपयुक्त हैं। बदले में, एक बाइट 'char' चर को पर्दे के पीछे 'int' में परिवर्तित किया जाना चाहिए, और इस ऑपरेशन को संसाधित करने के लिए कुछ प्रोसेसर समय की आवश्यकता है। – sgnsajgon
इसे पढ़ें: [ईओएफ की परिभाषा और इसका प्रभावी ढंग से उपयोग कैसे करें] (http://faq.cprogramming.com/cgi-bin/smartfaq.cgi?id=1043284351&answer=1048865140) –