2009-03-31 11 views
5

मैं सिर्फ printf के लिए मैन पेज देख रहा था और कुछ मेरे साथ हुआ। मैं सोच रहा था कि यहां कोई "भाषा वकील" है जो अपेक्षाकृत सरल प्रश्न का उत्तर दे सकता है :- पी।असंगत प्रिंटफ प्रारूप विनिर्देशों के बारे में प्रश्न

तो 'टी' संशोधक

एक निम्न पूर्णांक रूपांतरण एक ptrdiff_t तर्क से मेल खाती है के रूप में परिभाषित किया गया है।

तो क्या माना अगर आप इस एक अहस्ताक्षरित पूर्णांक रूपांतरण के साथ गठबंधन होने के लिए है? स्पष्ट रूप से ओ, यू, एक्स और एक्स सभी को बिना हस्ताक्षर किए गए मानों के रूप में व्याख्या करने का इरादा है, जबकि डी और मैं हस्ताक्षरित हैं।

इसी तरह, ptrdiff_t को छोड़कर सभी संशोधक (int/unsigned int, size_t/ssize_t, आदि) के लिए हस्ताक्षरित/हस्ताक्षरित संस्करण हैं।

प्रैक्टिस में, कुछ भी बुरा नहीं होता है क्योंकि प्रकार के हस्ताक्षरित संस्करण हस्ताक्षरित संस्करणों के समान स्थान पर कब्जा करते हैं। तो बाइट्स के बारे में सही ढेर से निकल जाता है।

तो कुछ भी नहीं है "बुरा", वास्तव में प्रिंट में "INT_MIN" को छोड़कर परीक्षण किया सब बातों के लिए उम्मीद मूल्य होता है, (यह मानते हुए कि sizeof(int) == sizeof(ptrdiff_t)

printf("%tu %td\n", INT_MIN, INT_MIN); 

प्रिंट

2147483648 -2147483648 

एक पर 32-बिट सिस्टम।

क्या मानक के बारे में कोई राय है? मुझे लगता है कि जवाब "अनिर्धारित व्यवहार" होगा। लेकिन मुझे लगा कि मैं पूछूंगा;)।

+0

साथ काम करना चाहिए सी ++ के साथ कुछ भी करने के लिए (कम से कम सी ++ 0x से पहले)? क्या printf() इत्यादि सी ++ 0x में सी 99 के अनुरूप होने के लिए बदला जा रहा है? मुझे लगता है कि आपको सी ++ टैग को हटाना चाहिए। –

+0

ptrdiff_t C++ में cstddef में परिभाषित किया गया है। printf स्पष्ट रूप से सी ++ में भी मौजूद है। मुझे सी ++ 0x बदलते प्रिंटफ के बारे में पता नहीं है। –

+0

hrmm, ऐसा लगता है कि C++ में c99 't' संशोधक नहीं हो सकता है। काफी उचित। –

उत्तर

3

यहां देखने के लिए कुछ भी नहीं है। आपके द्वारा लिखे गए कोड कानूनी हैं।

क्यों के रूप में बस कुछ तथ्य:

  • सब पर हस्ताक्षर किए पूर्णांक प्रकार एक ही आकार/संरेखण आवश्यकताओं
  • ptrdiff_t मानक से एक हस्ताक्षरित पूर्णांक प्रकार होने के लिए निर्धारित है के साथ, अहस्ताक्षरित प्रतिरूप हैं। इसलिए, यह एक हस्ताक्षरित जुड़वां है। (वास्तव में, समान तर्क size_t पर लागू होता है के रूप में अच्छी तरह से - ssize_t सी नहीं है, लेकिन POSIX)
  • t लंबाई विनिर्देशक इस है d, i, o, u, x, X प्रकार
+0

वैध हस्ताक्षर किए गए ptrdiff_t के बराबर क्या है? – user83255

+0

इसका कोई विशेष नाम नहीं है - आप केवल इतना कह सकते हैं कि यदि ptrdiff_t "लंबा लंबा" है तो इसके हस्ताक्षरित समकक्ष "लंबे समय तक हस्ताक्षर किए गए" हैं। – jpalecek

+0

आपके द्वारा छोड़ा जाने वाला महत्वपूर्ण तथ्य यह है कि, ऐसे मामलों में जहां मूल्य एक पूर्णांक प्रकार के हस्ताक्षरित और हस्ताक्षरित रूपों दोनों में फिट बैठता है, वही प्रतिनिधित्व होता है, और मानक स्पष्ट रूप से इस मामले में "गलत" तर्क प्रकार को पारित करने की अनुमति देता है (जो प्रोटोटाइप और विविध कार्यों के बिना कार्यों के लिए केवल वही संभव है, वैसे भी)। जहां तक ​​मैं कह सकता हूं, यह यूबी होगा नकारात्मक प्रारूप 'ptrdiff_t' मान पास करने के लिए जब प्रारूप विनिर्देशक एक हस्ताक्षरित प्रकार की अपेक्षा करता है। –

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