तो आप सोचते हैं कि आपको C आती है? (2016)

एक लोकप्रिय ऑनलाइन C क्विज़, जो undefined और implementation-defined व्यवहार पर टिकी है, ने फिर से इस बहस को छेड़ दिया है कि “C जानना” आखिर क्या होता है। टिप्पणीकर्ता integer sizes, struct padding, character encoding, shifts, और multiple increments जैसे edge cases का विश्लेषण करते हैं, और इस पर बहस करते हैं कि platform, compiler, और standard version बताए बिना उत्तर वास्तव में कब अनजाने हो जाते हैं। कई लोगों को ऐसे puzzles नुक्ताचीनी वाले या भ्रामक लगते हैं, खासकर वास्तविक दुनिया की चिंताओं—जैसे portability, target systems पर testing, और unreadable code से बचना—की तुलना में; जबकि दूसरे इन्हें निम्न-स्तरीय मान्यताओं की नाज़ुकता की उपयोगी याद दिलाने वाला मानते हैं.

क्विज़ पर समग्र प्रतिक्रिया

  • कई लोगों ने इस क्विज़ को C के कोने के मामलों और undefined behavior पर आधारित एक “gotcha” अभ्यास माना, न कि एक व्यावहारिक कौशल-परीक्षण।
  • कुछ लोगों ने इसे C की बारीकियों की याद दिलाने वाला माना; दूसरों को यह नुक्ताचीनी वाला, परेशान करने वाला, या तब “समय की बर्बादी” लगा जब उन्हें समझ आया कि मेटागेम है: “सही उत्तर है: आप नहीं जान सकते।”
  • एक बार-बार आने वाली शिकायत: उत्तर विकल्प “I don’t know” अस्पष्ट है; लोग “undefined,” “unspecified,” या “implementation-defined” जैसे स्पष्ट विकल्प चाहते थे।

Undefined / implementation-defined / unspecified व्यवहार

  • कई टिप्पणियाँ इस पर चर्चा करती हैं कि क्या विशिष्ट प्रश्न undefined behavior, implementation-defined behavior, या unspecified behavior से जुड़े हैं।
  • पहले प्रश्न को लेकर सीधा मतभेद है: कुछ इसे undefined कहते हैं, कुछ implementation-defined, कुछ “सिर्फ unspecified,” और कुछ यह भी指出 करते हैं कि लेख की व्याख्या स्वयं sizeof(int) == 4 मानती है, जो गारंटीशुदा नहीं है।
  • struct layout, integer widths, char signedness, character encoding (ASCII बनाम EBCDIC), और bit-width से ≥ शिफ्ट—इन सबको standard द्वारा जानबूझकर non-portable छोड़े गए व्यवहार के उदाहरणों के रूप में उद्धृत किया गया है।

ठोस तकनीकी चर्चाएँ

  • Integer promotions: int से छोटे types, arithmetic से पहले int में promote होते हैं, जिससे UB के आश्चर्यजनक स्थान बनते हैं (जैसे 16-bit बनाम 32-bit multiply के उदाहरण)।
  • Shifts: C और C++ में type की width से ≥ शिफ्ट करना UB है; अलग-अलग CPUs इसे अलग तरह से संभालते हैं (masking, zero, trap)।
  • Multi-increment expressions (i++ + ++i, chained XOR swap) को sequence points से जुड़ी classic undefined behavior के रूप में रेखांकित किया गया है।
  • Infinite loops: C और C++ इस बात में अलग हैं कि बिना observable side effects वाले loops को compiler कब optimize करके हटा सकता है; इसका embedded code पर असर पड़ता है।
  • Union-based type punning C में वैध है, लेकिन C++ में इसकी गारंटी नहीं है।

व्यावहारिकता बनाम शुद्धता

  • एक पक्ष का तर्क है कि वास्तविक परियोजनाओं में आप ज्ञात platforms को target करते हैं, de facto norms पर निर्भर करते हैं (जैसे 32-bit int, ASCII, IEEE-754), और इसे tests से सत्यापित करते हैं; हर edge case पर strict standard conformance अत्यधिक है।
  • दूसरा पक्ष जोर देता है कि गैर-गारंटीशुदा व्यवहार पर भरोसा नए compilers, flags, architectures, या embedded targets के साथ टूट सकता है; ऐसे क्विज़ खतरनाक मान्यताओं को उजागर करते हैं।

भाषाएँ, tools, और विकल्प

  • चर्चा C++ की quirks, D की casting syntax और integer sizing, Rust के safer shift methods, Gambit-C के जरिए Scheme, और C में GC उपयोग तक फैलती है।
  • कई लोगों का तर्क है कि बेहतर educational resources मौजूद हैं: best practices, memory management, safer idioms, और किताबें (जिसमें उसी site से जुड़ा PDF भी शामिल है)।