के एंड आर सी . से

A.6.5 अंकगणितीय रूपांतरण कई ऑपरेटर एक ही तरह से रूपांतरण और उपज परिणाम प्रकार का कारण बनते हैं। प्रभाव लाना है एक सामान्य प्रकार में संचालित होता है, जो परिणाम का प्रकार भी है। इस पैटर्न को कहा जाता है सामान्य अंकगणितीय रूपांतरण।

नीचे दिए गए कोड में EOF को -1 के रूप में परिभाषित किया गया है जो एक हस्ताक्षरित अभिन्न स्थिरांक है, ch को फिर int में परिवर्तित किया जाना चाहिए और जबकि लूप को अंततः बाहर किया जाना चाहिए, लेकिन ऐसा नहीं लगता है! इसलिए क्यू.

int main()
{
 unsigned char ch;
 FILE* fp;
 fp = fopen("myfile.txt","r");
 while((ch=getc(fp)) != EOF)
 {
  printf("%c", ch);
 }
 fclose(fp);
 return 0;
}
0
Hari 23 नवम्बर 2011, 14:27

4 जवाब

सबसे बढ़िया उत्तर

getc एक int देता है (क्योंकि यह सभी वर्ण मानों के साथ-साथ EOF को भी धारण करने में सक्षम होना चाहिए)।

अपने कोड में, जब आप इसे ch को असाइन करते हैं, तो आप इस मान को unsigned char कर देते हैं। फिर आप इसे int तक बढ़ा देते हैं, जिसका परिणाम कभी भी EOF नहीं होगा, क्योंकि -1 छोटा 255 हो जाता है, जो int 255 हो जाएगा।

5
Lindydancer 23 नवम्बर 2011, 14:33

यदि आप इसे अतिरिक्त चेतावनियों के साथ जीसीसी के साथ संकलित करते हैं, तो आपको चेतावनी मिलेगी:

 warning: comparison is always true due to limited range of data type

यह आपके द्वारा unsigned char के उपयोग के कारण है। c को परिभाषित करने के लिए सामान्य char या int का प्रयोग करें और यह काम करेगा।

2
Some programmer dude 23 नवम्बर 2011, 14:34

आपने ch को unsigned char के रूप में घोषित किया है, इसे int के रूप में घोषित किया जाना चाहिए। getc() का रिटर्न प्रकार int है।

1
JeremyP 23 नवम्बर 2011, 14:33

आपके द्वारा उद्धृत उदाहरण में अंकगणितीय रूपांतरण होता है होता है - unsigned char के ch = getc(fp) के परिणाम को int में बढ़ावा दिया जाता है, जब इसकी तुलना EOF< से की जाती है। समर्थन>1.

यह रूपांतरण -1 को unsigned char में परिवर्तित करने के परिणाम को पूर्ववत नहीं करता है, हालांकि - यदि उस रूपांतरण का परिणाम 255 है (क्योंकि unsigned char 8 बिट है), तो यह वापस परिवर्तित होने पर 255 के रूप में रहेगा। से int, क्योंकि 255 int की सीमा के भीतर है।


1. ऐसे प्लेटफॉर्म पर जहां int, unsigned char के सभी मूल्यों का प्रतिनिधित्व नहीं कर सकते हैं, उन्हें unsigned int में प्रचारित किया जाएगा, लेकिन ऐसे प्लेटफॉर्म बहुत दुर्लभ हैं।

0
caf 23 नवम्बर 2011, 15:05