सामग्री पर जाएँ
Topos Uranos

सारांश

यह पाठ पाठ्यक्रम की दूसरी इकाई को समाप्त करता है, जो डेटा और उनके प्रकारों को समर्पित है। यह अवधारणाओं की उस शृंखला को फिर से गढ़ता है जो चर से उस स्थिरांक तक जाती है जिस पर कंपाइलर नज़र रखता है, और रास्ते में पूर्णांकों के द्विआधारी निरूपण और उनके दो ओवरफ़्लो, सन्निकट वास्तविक संख्याओं और सहनसीमा, कोड के रूप में वर्णों और जानकारी खोने वाले रूपांतरणों से होकर गुज़रती है; इसमें से जो किसी भी भाषा में लागू होता है उसे C++ की अपनी विशेषताओं से अलग करता है; इकाई के अपरिभाषित व्यवहार को एक जगह रखता है, यह बताते हुए कि कंपाइलर क्या पकड़ता है, डिटेक्टर (sanitizer) क्या पकड़ता है और क्या कोई नहीं पकड़ता; अपने समापन मूल्यांकन में प्रवेश मूल्यांकन के कौशल दोहराता है; और पूरी इकाई को जोड़ने वाली छह चुनौतियों के साथ समाप्त होता है।

अधिगम उद्देश्य

  1. किसी समस्या के हर डेटा का प्रकार उन मानों के अनुसार चुनना और उसका औचित्य देना जो वह ले सकता है, उस सटीकता के अनुसार जो वह माँगता है, और उन संक्रियाओं के अनुसार जो उस पर की जाएँगी।
  2. किसी दिए गए प्रोग्राम में निरूपण की सीमाओं के प्रभावों का पूर्वानुमान लगाना: पूर्णांकों का ओवरफ़्लो, फ़्लोटिंग-पॉइंट का पूर्णांकन और किसी रूपांतरण में जानकारी की हानि।
  3. नामित स्थिरांकों और स्पष्ट रूपांतरणों का उपयोग करना, और यह समझाना कि हर स्थिति में कंपाइलर क्या जाँचता है।
  4. इकाई के अपरिभाषित व्यवहार को पहचानना और हर स्थिति के लिए बताना कि उसे क्या पकड़ता है और उससे कैसे बचा जाता है।
  5. इकाई में सीखी गई बातों में से, जो किसी भी भाषा में लागू होता है उसे C++ की अपनी विशेषताओं से अलग करना।

इकाई की उपलब्धियाँ

इस इकाई का लक्ष्य यह सिखाना था कि हर डेटा मेमोरी में एक प्रकार के साथ रहता है, जो तय करता है कि वह कौन-से मान ले सकता है, कितनी जगह घेरता है और कौन-सी संक्रियाएँ स्वीकार करता है, और यह कि इन सीमाओं के देखे जा सकने वाले परिणाम होते हैं। यह लक्ष्य केवल उन बातों के सहारे पूरा हुआ जिन्हें परिचय ने ज्ञात माना था: पाठ्यक्रम के विकल्पों के साथ कंपाइल करने और चलाने का कार्य-चक्र, फ़ॉर्मैट किया हुआ आउटपुट, std::cin से पढ़ना और कंपाइलर के संदेशों को पढ़ना। चार गणनाओं वाला वह प्रोग्राम, जिससे परिचय ने समस्या रखी थी, अब पंक्ति-दर-पंक्ति समझाया जा सकता है, और सुधारा भी जा सकता है।

चर और मेमोरी

पाठ चर और मेमोरी ने स्थापित किया कि चर मेमोरी की एक सेल है जिसका एक नाम, एक नियत प्रकार और बदलने वाला मान होता है, और कि प्रकार उसका आकार तय करता है, जिसे sizeof मापता है। उसने इनिशियलाइज़ेशन और असाइनमेंट में भेद किया, दिखाया कि कर्ली ब्रेस हानि वाले रूपांतरण को अस्वीकार करते हैं, और सिखाया कि असाइनमेंट प्रतिलिपि बनाता है, बाँधता नहीं, और कि बदला गया मान खो जाता है; इसी से अदला-बदली के लिए सहायक चर निकलता है। उसने प्रोग्राम की अवस्था को उसके चरों के मानों के समुच्चय के रूप में परिभाषित किया और ट्रेस तालिका से उसका अनुसरण करना सिखाया। उसने नामकरण की परिपाटियाँ तय कीं और इकाई के पहले अपरिभाषित व्यवहार के साथ समाप्त किया: ऐसे चर को पढ़ना जिसे कभी मान नहीं मिला।

पूर्णांक और उनका निरूपण

पाठ पूर्णांक और उनका निरूपण ने आधार 10, 2 और 16 में स्थानीय मान पद्धति सिखाई। इस बात से कि किसी प्रकार में nn बिट होते हैं, उसने उसकी मानों की परास निकाली: 2n2^n बिट पैटर्न, जो अचिह्नित रूप में 00 से 2n−12^n - 1 तक की संख्याएँ निरूपित करते हैं और चिह्नित रूप में, दो के पूरक में, −2n−1-2^{n-1} से 2n−1−12^{n-1} - 1 तक की, जिनमें ऋणात्मक संख्याएँ धनात्मक संख्याओं से एक अधिक हैं। उसने दो ओवरफ़्लो में भेद किया: अचिह्नित पूर्णांकों का ओवरफ़्लो, जो मापांक 2n2^n अंकगणित है और परिभाषित है (0u - 1 का मान 4 294 967 2954\,294\,967\,295 है), और चिह्नित पूर्णांकों का ओवरफ़्लो, जो अपरिभाषित व्यवहार है और जिसे डिटेक्टर रोक देता है। उसने दिखाया कि किसी चिह्नित पूर्णांक की अचिह्नित पूर्णांक से तुलना पहले वाले को रूपांतरित कर देती है, जिससे −1<0u-1 < 0u असत्य होता है, और अंत में डेटा की पूर्वानुमेय परास के अनुसार पूर्णांक प्रकार चुनने की एक कसौटी दी।

फ़्लोटिंग-पॉइंट संख्याएँ

पाठ फ़्लोटिंग-पॉइंट संख्याएँ ने दिखाया कि कोई वास्तविक संख्या चिह्न, घातांक और द्विआधारी मैंटिसा के रूप में रखी जाती है, इसलिए निरूपणीय मान परिमेय संख्याओं का एक परिमित समुच्चय हैं जिनका हर 2 की घात है। इससे यह निकला कि 0.10.1 मशीन में मौजूद नहीं है: उसकी जगह सबसे निकट का double मान रखा जाता है, और 0.1 + 0.2 को 0.30000000000000004 लिखा जाता है। पाठ ने हर पूर्णांकन की त्रुटि को सीमित किया, दिखाया कि त्रुटियाँ जमा होती हैं और योग साहचर्य नहीं रहता; इससे उसने निष्कर्ष निकाला कि दो परिकलित वास्तविक संख्याओं की तुलना == से नहीं, बल्कि उनकी दूरी से, एक उचित ठहराई गई सहनसीमा के साथ की जाती है। उसने double को डिफ़ॉल्ट वास्तविक प्रकार तय किया, और अनंत तथा अ-संख्या, NaN, का परिचय दिया।

वर्ण, बूलियन, रूपांतरण और स्थिरांक

पाठ वर्ण, बूलियन, रूपांतरण और स्थिरांक ने दिखाया कि प्रकार बिटों को पढ़ने का एक नियम है: char एक बाइट रखता है जिसका मान वर्ण का ASCII कोड है, और चूँकि अंकों और अक्षरों के कोड क्रमागत हैं, '7' - '0' का मान 7 है; bool सत्य या असत्य होता है, और शून्य से भिन्न हर संख्या सत्य में रूपांतरित होती है। उसने अंतर्निहित रूपांतरणों का अध्ययन किया और स्थापित किया कि रूपांतरण संक्रिया के भीतर, ऑपरेंडों के प्रकार के अनुसार होता है, परिणाम को सहेजते समय नहीं: double r{7 / 2} में मान 3 है। उसने इच्छित रूपांतरण को static_cast से लिखना सिखाया, जो हानि को रोकता नहीं, बल्कि उसे घोषित करता है; स्पष्ट किया कि कर्ली ब्रेस संकुचन को अस्वीकार करते हैं, और इकाई का तीसरा अपरिभाषित व्यवहार दिखाया: ऐसी वास्तविक संख्या का पूर्णांक में रूपांतरण जो उसमें नहीं समाती। उसने स्थिरांकों (const, constexpr और static_assert), लिटरलों के प्रकार और auto के साथ समाप्त किया।