2015-09-11 3 views
9

कार्यों का printf परिवार और h (एक signed short या unsigned short तर्क int करने के लिए प्रोत्साहित दर्शाने) (क signed char या unsigned char तर्क int करने के लिए प्रोत्साहित दर्शाने) लंबाई संशोधक की एक श्रृंखला, उनमें से दो की जा रही hh प्रदान करते हैं। ऐतिहासिक रूप से, इन लंबाई संशोधक को केवल scanf के लम्बाई संशोधकों के साथ समरूपता बनाने के लिए पेश किया गया है और शायद ही कभी printf के लिए उपयोग किया जाता है। ¶7 2011 §7.21.6.1 "fprintf समारोह":क्या एच या एचएच लम्बाई संशोधक का उपयोग करना अवैध है जब printf के लिए संबंधित तर्क छोटा/छोटा नहीं था?

यहाँ आईएसओ का एक अंश 9899 है

7 लंबाई संशोधक और उनके अर्थ हैं:

  • hh निर्दिष्ट करता है कि एक निम्नलिखित d, i, o, u, x, या X रूपांतरण विनिर्देशक signed char या unsigned char तर्क पर लागू होता है (argumen टी को पूर्णांक पदोन्नति के अनुसार प्रचारित किया जाएगा, लेकिन प्रिंटिंग से पहले इसका मान signed char या unsigned char में परिवर्तित किया जाएगा); या कि निम्न n रूपांतरण विनिर्देश एक हस्ताक्षर किए गए char तर्क के लिए सूचक पर लागू होता है।

  • h पूर्णांक प्रोन्नति के अनुसार निर्दिष्ट करता है कि एक निम्नलिखित d, i, o, u, x, या X रूपांतरण विनिर्देशक short int या unsigned short int तर्क पर लागू होता है (तर्क पदोन्नत किया गया है जाएगा, लेकिन अपने मूल्य परिवर्तित किया जाएगा मुद्रण से पहले short int या unsigned short int पर); या कि निम्न n रूपांतरण विनिर्देश एक पॉइंटर पर एक छोटे int तर्क पर लागू होता है।

  • ...

n रूपांतरण विनिर्देशक के मामले की अनदेखी करते हुए क्या है इन लगभग समान पैराग्राफ h और hh के व्यवहार के बारे में कहने?

  • this answer में, यह दावा किया जाता है कि एक तर्क एक signed char, signed short, unsigned char, या unsigned short resp की सीमा के बाहर है कि गुजर। h या hh लंबाई संशोधक resp के साथ रूपांतरण विनिर्देश के लिए। अपरिभाषित व्यवहार, क्योंकि तर्क char, short, आदि से परिवर्तित नहीं किया गया था। पहले।
  • मैं दावा है कि समारोह प्रकार int के हर मूल्य और के रूप में यदि पैरामीटर char, short, आदि resp में बदल दिया गया है कि printf बर्ताव करता है के लिए एक अच्छी तरह से परिभाषित ढंग से चल रही है। रूपांतरण से पहले।
  • कोई यह भी दावा कर सकता है कि फ़ंक्शन को उस तर्क के साथ आविष्कार करना जो डिफ़ॉल्ट तर्क पदोन्नति को अपरिभाषित व्यवहार से पहले संबंधित प्रकार का नहीं था, लेकिन यह अचूक लगता है।

§7.21.6.1¶7 (यदि बिल्कुल) की इन तीन व्याख्याओं में से कौन सा सही है?

+1

मैंने पहला दावा किया (लिंक किए गए उत्तर देखें)। मैं वास्तव में सोचता हूं कि अगर हम पैराग्राफ में इस्तेमाल किए गए शब्दों के साथ पैडेंटिक हैं तो मेरा दावा खड़ा है (पदोन्नति से पहले तर्क 'छोटा' संस्करण है) लेकिन इस पैराग्राफ/सी की भावना 'FUZxxl' का दावा शायद अधिक हो सकती है। – ouah

+0

मुझे लगता है कि पहला दृष्टिकोण सही है। रूपांतरण दिनचर्या सीमित सीमा की अपेक्षा कर सकती है, इस प्रकार एक अनुकूलित संस्करण का उपयोग करें (केवल 8 या 16 बिट सीपीयू के बारे में सोचें)। निश्चित नहीं है, अगर इनपुट तर्क एक ही प्रकार का होना चाहिए। प्रश्न यह है कि प्रारूप-स्ट्रिंग पार्सर कैसे 'छोटा'/इनपुट से "सत्य" 'int 'इनपुट तर्क बता सकता है। 'int' में परिवर्तित एक और पहलू संकलक द्वारा रेखांकित किया जा सकता है। सबसे खराब यह अनुकूलन को रोक सकता है, लेकिन कुछ और नहीं, क्योंकि इसे भी व्यवहार करना है। – Olaf

+0

यह लाइन कुछ हद तक अस्पष्ट है - '% h ...... लेकिन इसका मान छपाई से पहले लघु int या हस्ताक्षरित लघु int में परिवर्तित हो जाएगा)'। तो क्या इसका मतलब यह है कि यह 'हस्ताक्षरित शॉर्ट इंट/शॉर्ट इंट' से अधिक मान रख सकता है क्योंकि यह पूर्णांक पदोन्नति से गुजर रहा है? और यदि मूल्य से अधिक है तो इसे वापस अपने मूल परिवर्तनीय प्रकार में परिवर्तित कर दिया गया है? इसका नतीजा क्या होगा? – ameyCU

उत्तर

4

मानक निर्दिष्ट:

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

[C2011 7.21.6.1/9]

क्या "सही प्रकार" का क्या मतलब है, क़यास व्याख्या के लिए खुला है, लेकिन मेरे लिए सबसे प्रशंसनीय व्याख्या प्रकार है कि रूपांतरण विनिर्देश "लागू होता है "जैसा कि पहले एक ही खंड में निर्दिष्ट किया गया था, और जैसा कि, प्रश्न में, उद्धृत किया गया है। मैं मूलभूत सामान्य तर्क-गुजरने वाले नियमों को स्वीकार करने के लिए तर्क पदोन्नति के बारे में टिप्पणियां लेता हूं, और विशेष कार्यों के इन कार्यों के किसी भी निहितार्थ से परहेज करता हूं। मैं तर्कसंगत टिप्पणियों को तर्क के "सही प्रकार" को निर्धारित करने के लिए प्रासंगिक नहीं लेता हूं।

वास्तव में क्या होता है यदि आप रूपांतरण विनिर्देश के लिए सही से अधिक प्रकार के तर्क को पार करते हैं तो एक अलग सवाल है। मुझे विश्वास है कि सी सिस्टम किसी के द्वारा लागू करने की संभावना नहीं है, जिससे यह कोई फर्क पड़ता है कि printf() तर्क वास्तव में char है, या यह int है जिसका मूल्य char की सीमा में है। हालांकि, मैं जोर देता हूं कि संकलक के साथ तर्क प्रकार पत्राचार की जांच करने के लिए संकलक के लिए वैध व्यवहार है, और यदि कोई मेल नहीं है तो प्रोग्राम को अस्वीकार कर दें (क्योंकि इस तरह के मामले में आवश्यक व्यवहार स्पष्ट रूप से अपरिभाषित है)।

दूसरी तरफ, मैं निश्चित रूप से printf() कार्यान्वयन की कल्पना कर सकता हूं जो वास्तव में गलत व्यवहार (कचरा प्रिंट, दूषित स्मृति, अपना दोपहर का खाना खाएं) यदि तर्क का मूल्य संबंधित रूपांतरण विनिर्देशक द्वारा उल्लिखित सीमा से बाहर है। अपरिभाषित व्यवहार के कारण यह भी अनुमति है।

+0

आईआईएफ मैं 'एच' के साथ एक रूपांतरण के लिए' int' पास करता हूं, तो तर्क प्रकार 'एच' के रूप में मेल खाता है जो डिफ़ॉल्ट तर्क पदोन्नति के बाद "हस्ताक्षरित या हस्ताक्षरित 'शॉर्ट' के प्रकार की अपेक्षा करता है," और 'int' प्रकार। – fuz

+0

@FUZxxl, नहीं, आपने गलत तरीके से गलत किया है। मानक कहता है 'एच' का अर्थ है रूपांतरण विनिर्देशक "एक छोटे से int या हस्ताक्षरित लघु int तर्क पर लागू होता है" - विचार के अंत। यह उस संदर्भ में तर्क पदोन्नति पर टिप्पणी करता है, लेकिन यह एक अलग और सहायक विचार है, जैसा कि उन टिप्पणियों द्वारा संकेतित किया गया है। –

+0

@ जॉन बोलिंगर: इसलिए लिंक किए गए प्रश्न में कोड यूबी का आह्वान नहीं करता है अगर मैं निहित पदोन्नति के कारण% d प्रारूप विनिर्देशक का उपयोग करता हूं। सही? – Destructor

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