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

सारांश

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

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

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

मान और प्रभाव

पाठ अंकगणितीय संक्रियाएँ ने व्यंजक का अध्ययन एक ऐसे वृक्ष के रूप में किया जो एक मान में सिमट जाता है: 2 + 3 * 4 का मान 14 है, और इसकी गणना व्यंजक के बाहर कुछ नहीं बदलती। पाठ संबंध और तर्क ने यही शर्तों के साथ किया, जिनका मान true या false होता है। लेकिन कुछ व्यंजक ऐसे हैं जो मान देने के साथ-साथ प्रोग्राम की अवस्था पर एक छाप छोड़ते हैं: वे किसी चर का मान बदलते हैं, स्क्रीन पर लिखते हैं या इनपुट से पढ़ते हैं। इस छाप को साइड इफ़ेक्ट, या केवल प्रभाव, कहते हैं, और “साइड” शब्द का अर्थ यह नहीं कि यह कम महत्त्वपूर्ण है: x = 7 में प्रभाव, यानी x का 7 हो जाना, ठीक वही है जो चाहा गया है।

यदि ऐसा है, तो हर व्यंजक को दो प्रश्नों के साथ पढ़ना चाहिए: वह क्या देता है और क्या करता है। तीन उदाहरण इस भेद को पक्का करते हैं। count + 1, count के बाद आने वाली संख्या देता है और कुछ नहीं करता: count अपना मान बनाए रखता है। count = 9, 9 देता है और count को 9 बना देता है। std::println("नमस्ते") भी एक व्यंजक है, एक फ़ंक्शन की कॉल, और उसमें जो मायने रखता है वह उसका प्रभाव है: एक पंक्ति लिखना। अपने फ़ंक्शन पाठ फ़ंक्शन में पढ़े जाएँगे, और वहाँ यह भेद फिर आएगा: जो फ़ंक्शन केवल अपना परिणाम निकालता है, उसे समझना और परखना उस फ़ंक्शन से आसान है जो इसके अलावा अपने बाहर कुछ बदलता है।

count + 1; जैसा स्टेटमेंट वैध C++ है: मान की गणना होती है और उसे फेंक दिया जाता है, इसलिए वह किसी काम का नहीं, और GCC -Wunused-value से इसकी चेतावनी देता है। एक व्यंजक-स्टेटमेंट का अर्थ उसके प्रभाव से होता है। इससे यह निकलता है कि प्रभाव वाले व्यंजक ही प्रोग्राम को आगे बढ़ाते हैं, और वही सावधानी भी माँगते हैं, क्योंकि प्रभाव किसी क्षण घटित होता है, और वह क्षण हमेशा वह नहीं होता जो पाठक मान लेता है।