कार्यों का 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 (यदि बिल्कुल) की इन तीन व्याख्याओं में से कौन सा सही है?
मैंने पहला दावा किया (लिंक किए गए उत्तर देखें)। मैं वास्तव में सोचता हूं कि अगर हम पैराग्राफ में इस्तेमाल किए गए शब्दों के साथ पैडेंटिक हैं तो मेरा दावा खड़ा है (पदोन्नति से पहले तर्क 'छोटा' संस्करण है) लेकिन इस पैराग्राफ/सी की भावना 'FUZxxl' का दावा शायद अधिक हो सकती है। – ouah
मुझे लगता है कि पहला दृष्टिकोण सही है। रूपांतरण दिनचर्या सीमित सीमा की अपेक्षा कर सकती है, इस प्रकार एक अनुकूलित संस्करण का उपयोग करें (केवल 8 या 16 बिट सीपीयू के बारे में सोचें)। निश्चित नहीं है, अगर इनपुट तर्क एक ही प्रकार का होना चाहिए। प्रश्न यह है कि प्रारूप-स्ट्रिंग पार्सर कैसे 'छोटा'/इनपुट से "सत्य" 'int 'इनपुट तर्क बता सकता है। 'int' में परिवर्तित एक और पहलू संकलक द्वारा रेखांकित किया जा सकता है। सबसे खराब यह अनुकूलन को रोक सकता है, लेकिन कुछ और नहीं, क्योंकि इसे भी व्यवहार करना है। – Olaf
यह लाइन कुछ हद तक अस्पष्ट है - '% h ...... लेकिन इसका मान छपाई से पहले लघु int या हस्ताक्षरित लघु int में परिवर्तित हो जाएगा)'। तो क्या इसका मतलब यह है कि यह 'हस्ताक्षरित शॉर्ट इंट/शॉर्ट इंट' से अधिक मान रख सकता है क्योंकि यह पूर्णांक पदोन्नति से गुजर रहा है? और यदि मूल्य से अधिक है तो इसे वापस अपने मूल परिवर्तनीय प्रकार में परिवर्तित कर दिया गया है? इसका नतीजा क्या होगा? – ameyCU