मनोविज्ञान कहानियों शिक्षा

आदेश दें और शांत रहें. शांति

जब ऐसा लगता है कि अगला स्तर पार हो गया है, तो परछाइयाँ निश्चित रूप से बाहर रेंगेंगी और जाँचेंगी कि उनके नृत्य के दौरान संतुलन और मन की उपस्थिति बनी हुई है या नहीं।

छाया की प्रतिक्रिया अहंकार के पेंडुलम को हिला देती है और क्रूर सत्य को उजागर करती है: संतुलन रस्सी पर चलने वाले की सावधानी की तरह तनावपूर्ण हो जाता है और बहादुर आदमी को अतीत की खाई में फेंकने वाला होता है।

सच्चा संतुलन पक्षपातपूर्ण अवलोकन का अभाव है: यहां जो हो रहा है उसकी खोज करना सही नहीं है।

आंतरिक विचारक का कहना है, "सब कुछ हमेशा की तरह है," भले ही आसपास कोई प्लेग हो या खतरे आ रहे हों, "यह सिर्फ इतना है कि ये लोग घायल हैं और उन्हें अपने रास्ते के बारे में जागरूक होने की जरूरत है।

लेकिन यदि अन्य प्रतिक्रियाएँ हैं, तो पथ पूरा नहीं हुआ है और चरण का पूरा होना अभी बाकी है।

- मुझे इसकी क्या आवश्यकता है? - आप स्तर के माध्यम से अपनी यात्रा की शुरुआत में ही हैं।
मैं मौत से लड़ने के लिए तैयार हूँ! आप एक चौथाई रास्ते पर हैं.
मुझे इस तरह का रोमांच पसंद है! - आधा रास्ता पहले ही बीत चुका है।
- मेरे पास आओ, मैं तुम्हें बचा लूँगा - तुम तीन-चौथाई रास्ता तय कर चुके हो।
– मैं आपका कितना आभारी हूं कि आप बिल्कुल वैसे ही हैं! - स्तर के अंत तक रास्ते का 2/10 भाग।
– यात्री, आप कहाँ जा रहे हैं और अपनी आक्रामकता से क्या हासिल करना चाहते हैं? - आपने यह स्तर पास कर लिया है और खतरनाक छाया परीक्षा दे रहे हैं।

द शैडो में बहुत सारा प्यार और बहुत सारी कलात्मकता है। एक अच्छी शिक्षिका के रूप में, वह आपके संतुलन को परखने के लिए तानाशाह, पीड़ित और बचावकर्ता की भूमिका बखूबी निभाती है। आख़िरकार, गेमर्स की भाषा में: संतुलन ईश्वरीय स्तर है।

©मार्क इफ़्रैमोव

********

शांति के नियम

जाने देने के लिए तैयार हो जाओ.

जो लोग आपको मूर्ख बनाते हैं, हेरफेर करते हैं, दोष देते हैं, शिकायत करते हैं, दुखी होते हैं, आपको पागल कर देते हैं, आपको भावनात्मक शांति से वंचित कर देते हैं।

बराबर हो।

वह समानता, जिसमें हर कोई अपने जीवन के लिए ज़िम्मेदार है, और यह इंतज़ार नहीं करता कि कोई उन्हें खुश करेगा या उन्हें बताएगा कि कैसे जीना है।

सावधान रहिए।

शिकायतों और हेराफेरी के आगे न झुकें। रिश्ते दूसरे के जीवन में उपस्थिति हैं, उसका उद्धार नहीं। मदद के लिए सीधे अनुरोध से भ्रमित न हों। पूछें - आपके लिए यथासंभव मदद करें।

जाने के लिए तैयार हो जाओ.

कलह और आरोप-प्रत्यारोप में न पड़ें. बहाने मत बनाओ. यदि आप गलत हैं तो क्षमा करें। बहुत हो गया। यदि आपने किसी व्यक्ति की भावनाओं को बहुत अधिक ठेस पहुंचाई है, तो पूछें कि उसकी भरपाई के लिए क्या किया जा सकता है? यदि कोई प्रतिक्रिया नहीं होती है, तो दूर जाने के लिए तैयार रहें। यह आपके अपराध के बारे में नहीं है, बल्कि उसके आरोपों के बारे में है।

दृढ़ हों।

“आपकी प्रशंसा की जाती है - आनन्दित न हों। वे डांटते हैं - परेशान मत हो ”(सी)। आप हर समय जीत या हार नहीं सकते। आप हर चीज़ को हानि और लाभ में भी नहीं बाँट सकते। इस घटना की बदौलत आपने जो सीखा है और जो आपने स्वयं में खोजा है उसे खोजें। दृढ़ कदमों से अपने पथ पर चलो।

गुजर रहे हो.

अन्य लोगों के झगड़ों, गपशप, स्पष्टता, मूल्यांकन, क्रोध, बदला, शिकायत, लेबल, ईर्ष्या से गुजरें। इन सब में मत उलझो, समर्थन मत करो, अपना समय बर्बाद मत करो... चलो...

जाने के लिए तैयार हो जाओ.

हम C++17 मानक के भाषा नवाचारों से परिचित होते रहते हैं। इस लेख में, हम उस पर विचार करेंगे जिसे मैं भाषा की उत्कृष्टता की निरंतरता कहूँगा। वे। हम यहां कार्यक्षमता के दृष्टिकोण से कोई भी पूरी तरह से नई चीजें नहीं देखेंगे - बल्कि, पुरानी कार्यक्षमता को और अधिक स्वीकार्य स्थिति में लाएंगे। यहां हम देखेंगे कि उप-अभिव्यक्तियों के निष्पादन के क्रम में क्या बदलाव आया है, वैकल्पिक प्रतिलिपि के बहिष्कार के संबंध में क्या नई गारंटी सामने आई है, और यह भी कि लैम्ब्डा में क्या जोड़ा गया है।

चीजों को क्रम में रखना

कई C++ प्रोग्रामर के सामने "दिलचस्प" समस्याएं आई हैं जिनमें कुछ विवादास्पद कोड दिए गए हैं और सवाल यह है: "आउटपुट क्या होगा?" ऐसे कोड का एक सामान्य उदाहरण निम्नलिखित उदाहरण है:

पूर्णांक मैं = 0; मैं = मैं++ + मैं++;

ऐसा "स्मार्ट" कोड नेटवर्क और साक्षात्कार दोनों में पाया जाता है। ऐसे प्रश्नों का उद्देश्य यह पता लगाना है कि उत्तरदाता C++ में अभिव्यक्तियों के निष्पादन के क्रम की ख़ासियत से कितना परिचित है।

कम से कम यही तो घोषित लक्ष्य है. सच है, मेरा मानना ​​है कि ज्यादातर मामलों में ऐसे सवाल पूछने वाला व्यक्ति सिर्फ अपने अहंकार का मनोरंजन करना चाहता है। यह जानना पूरी तरह से वैकल्पिक है कि ऐसा कोड क्या आउटपुट देगा, क्योंकि ऐसा कोड लिखा ही नहीं जा सकता। और जब आप लिख नहीं सकते तो आवेदक से इस बारे में क्यों पूछें? ऐसे प्रश्न "धूम्रपान कक्ष" के लिए उपयुक्त हैं जहां साथी प्रोग्रामर किनारे के मामलों पर चर्चा करते हैं; वे साक्षात्कार के लिए उपयुक्त नहीं हैं. मैं इस विषय पर रेमंड चेन के विचारों को पढ़ने की सलाह देता हूं: "क्या लोग सीधे चेहरे के साथ कई ओवरलैपिंग साइड इफेक्ट्स के साथ पागल कोड लिखते हैं?"

लेकिन यह एक पैथोलॉजिकल मामला है जो नग्न आंखों से दिखाई देता है, और, जैसा कि मैंने पहले ही उल्लेख किया है, एक सामान्य प्रोग्रामर कभी भी ऐसा नहीं लिखेगा। लेकिन ऐसे कम स्पष्ट मामले हैं जिन्हें अनुभवी प्रोग्रामर भी लिख सकते हैं। आइए कोड के इस टुकड़े को देखें:

शून्य f2() ( std::string s = "लेकिन मैंने सुना है कि यह काम करता है भले ही आप इस पर विश्वास न करें"; s.replace(0, 4, "") .replace(s.find("even" ), 4, "केवल") .replace(s.find("don"t"), 6, "");assert(s == "मैंने सुना है कि यह केवल तभी काम करता है जब आप इस पर विश्वास करते हैं"); )

यह कोड स्ट्रॉस्ट्रुप की नवीनतम पुस्तक, द सी++ प्रोग्रामिंग लैंग्वेज के चौथे संस्करण में खंड 36.3.6 में प्रस्तुत किया गया है, और पहली नज़र में यह काफी उपयोगी और सही लगता है। लेकिन यह केवल पहली नज़र में है, वास्तव में इसकी कोई गारंटी नहीं है कि उपरोक्त कोड अपेक्षित स्ट्रिंग बनाएगा, और, तदनुसार, एस्टर काम नहीं करेगा।

जैसा कि हम देख सकते हैं, C++ के निर्माता ने भी कोड के इतने छोटे से हिस्से में गलती की। यह क्या कहता है? सबसे पहले, आपको कोड के एक समूह को एक अभिव्यक्ति में रटने की ज़रूरत नहीं है जिसमें बहुत सारी अलग-अलग चीज़ें होती हैं। इस कोड का पहला संस्करण, जो पुस्तक के उसी पृष्ठ पर प्रस्तुत किया गया है, बहुत सरल और बेहतर है:

शून्य f() ( std::string s = "लेकिन मैंने सुना है कि यह काम करता है भले ही आप इस पर विश्वास न करें"; s.replace(0, 4, ""); s.replace(s.find(" सम"), 4, "केवल"); s.replace(s.find("don"t"), 6, "");assert(s == "मैंने सुना है कि यह केवल तभी काम करता है जब आप इस पर विश्वास करते हैं" ); )

यह विकल्प न केवल प्रोग्राम क्रियान्वयन की दृष्टि से सही है, बल्कि इसे पढ़ना भी आसान है। लेकिन यह एकमात्र निष्कर्ष नहीं है जिसे हमें निकालना चाहिए, एक और निष्कर्ष है जो प्रस्ताव P0145R3 के लेखक पहले ही हमारे लिए बना चुके हैं: C++ में अभिव्यक्ति उपअभिव्यक्तियों के निष्पादन के क्रम में कुछ गड़बड़ है।

पुराना आदेश

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

उदाहरण के लिए, आइए अपना पहला उदाहरण लें: i = i++ + i++; . बड़ी अभिव्यक्ति में 4 छोटे उपअभिव्यक्तियाँ हैं: i , i++ , i++ और i++ + i++ । C++14 मानक क्या गारंटी देता है? यह गारंटी देता है ( expr.ass ) कि दोनों i++ अभिव्यक्तियों का मूल्यांकन उनके योग की गणना से पहले किया जाता है, और i अभिव्यक्ति का मूल्यांकन योग के परिणाम को निर्दिष्ट करने से पहले किया जाता है। मैं आपको यह भी याद दिलाता हूं कि i++ एक्सप्रेशन i का पुराना मान लौटाता है, और फिर i को एक (वृद्धि) से बढ़ा देता है। बदले में, इसका मतलब यह है कि अभिव्यक्ति का मूल्यांकन तब माना जाता है जब i का पुराना मान प्राप्त होता है।

इस प्रकार, यह पता चलता है कि कंपाइलर पूर्ण अभिव्यक्ति का मूल्यांकन करने के लिए कई तरीके चुन सकता है: यह सीमित नहीं है कि ++ का प्रभाव i पर कब लागू किया जाना चाहिए। परिणामस्वरूप, हम i में अलग-अलग मान प्राप्त कर सकते हैं, जो निश्चित रूप से अच्छा नहीं है, क्योंकि कार्यक्रम को एक पूर्वानुमानित परिणाम उत्पन्न करना चाहिए जो संकलक की इच्छा से स्वतंत्र हो। उदाहरण के लिए, आदेश हो सकता है:

    हम पहले i की गणना करते हैं, यह 0 के बराबर है।

    हम दूसरे i की गणना करते हैं, यह 0 के बराबर है।

    हम दूसरी वृद्धि का परिणाम लिखते हैं, हमें i == 1 मिलता है।

    हम पहली वृद्धि का परिणाम लिखते हैं, हमें i == 2 मिलता है।

    समान चिह्न के बाईं ओर i की गणना करें।

    योग की गणना करें: 0 + 0 == 0।

    हम योग का परिणाम i में लिखते हैं।

    हम पूर्ण अभिव्यक्ति का परिणाम लौटाते हैं, अर्थात। मैं , जो 0 है .

आप उपरोक्त चरणों को किसी भी क्रम में कर सकते हैं जो मानक द्वारा प्रदान की गई गारंटी का उल्लंघन नहीं करता है, और परिणामस्वरूप आपको अलग-अलग उत्तर मिलेंगे।

वैसे, आप एक सरल विकल्प पर विचार कर सकते हैं: i = ++i + i++; . यहां आप तुरंत देख सकते हैं कि पहले ++i या i++ का मूल्यांकन क्या किया जाएगा इसके आधार पर परिणाम भिन्न होगा, क्योंकि पहली अभिव्यक्ति के मूल्यांकन से पहले इसके दुष्प्रभाव होते हैं (i को एक से बढ़ाना)।

हालाँकि दूसरा विकल्प अधिक उदाहरणात्मक है, दोनों ही तथाकथित देते हैं अपरिभाषित व्यवहार(एनपी, अंग्रेजी अपरिभाषित व्यवहार)। सभी अनुभवी C++ प्रोग्रामर इस शब्द से परिचित हैं, लेकिन शायद ही बहुत से लोग C++ भाषा में उन सभी स्थानों को जानते हैं जहां यह व्यवहार हो सकता है। यह एक व्यापक और दिलचस्प विषय है, जिसे एक से अधिक लेखों में शामिल किया जा सकता है, इसलिए मैं इस पर अधिक विस्तार से ध्यान नहीं दूंगा। दरअसल, अभिव्यक्ति के इतने विस्तृत विश्लेषण की जरूरत नहीं थी, क्योंकि मानक (intro.execution/p15 ) के अनुसार हमारी अभिव्यक्ति है एनपी पहले से ही क्योंकि एक अभिव्यक्ति में दो उपअभिव्यक्तियाँ होती हैं जो एक ही अदिश वस्तु को संशोधित करती हैं, और परिवर्तनों का क्रम परिभाषित नहीं होता है। फिर मैंने यह विश्लेषण क्यों दिया? मैंने यह दिखाने की कोशिश की कि ऐसा क्यों है एनपी अभिव्यक्ति के निष्पादन पर मौजूदा प्रतिबंधों के आधार पर खुद को प्रकट करता है, अर्थात। लक्ष्य यह दिखाना था कि मौजूदा नियमों के साथ, मानक के पास कंधे उचकाने के अलावा कोई अन्य विकल्प नहीं है।

अब आइए अपने दूसरे उदाहरण पर चलते हैं और पता लगाते हैं कि इसमें क्या गलत है। इसे समझना आसान बनाने के लिए, मैं इस उदाहरण को इस अभिव्यक्ति में छोटा कर दूंगा: s.replace(s.find("सम"), 4, "केवल"). हमारे पास यहां क्या है? एक ऑब्जेक्ट s है, सदस्य फ़ंक्शन std::string::replace के लिए एक कॉल है, एक अन्य फ़ंक्शन std::string::find है, और इन फ़ंक्शन के लिए तर्क हैं। मानक हमें क्या गारंटी देता है? मानक गारंटी देता है कि फ़ंक्शन तर्कों का मूल्यांकन फ़ंक्शन को कॉल करने से पहले किया जाता है। यह यह भी सुनिश्चित करता है कि जिस ऑब्जेक्ट पर फ़ंक्शन निष्पादित किया जा रहा है, उस पर फ़ंक्शन कॉल करने से पहले उसका मूल्यांकन किया जाना चाहिए। यह सब स्पष्ट और तार्किक है. सच है, हमारे पास कोई अन्य गारंटी नहीं है: इस बात की कोई गारंटी नहीं है कि प्रतिस्थापित फ़ंक्शन के तर्कों का मूल्यांकन करने से पहले एस का मूल्यांकन किया जाएगा, और उस क्रम के संबंध में भी कोई गारंटी नहीं है जिसमें इन तर्कों का मूल्यांकन किया जाता है। इसलिए, हम यह मूल्यांकन क्रम प्राप्त कर सकते हैं: s.find("even") , "only" , 4 , s , s.replace(...) . या कोई अन्य जो मानक की पहले से निर्दिष्ट गारंटी का उल्लंघन नहीं करता है।

उपरोक्त पाठ से, 2 मुख्य बिंदुओं को अलग करने की आवश्यकता है: 1) बिंदु के बाईं और दाईं ओर के भावों का मूल्यांकन किसी भी क्रम में किया जा सकता है, 2) फ़ंक्शन तर्कों का मूल्यांकन किसी भी क्रम में किया जा सकता है। इसके आधार पर, अब यह स्पष्ट होना चाहिए कि स्ट्रॉस्ट्रुप की पुस्तक का कोड गलत क्यों है। एक अभिव्यक्ति में:

S.replace(0, 4, "") .replace(s.find("even"), 4, "only") .replace(s.find("don"t"), 6, "");

खोजने के लिए दोनों कॉल पिछले (कोड में) प्रतिस्थापन के पूरा होने से पहले समाप्त हो सकती हैं। और शायद उसके बाद भी. यहाँ तक कि पहला पहले कर सकता है, और दूसरा बाद में - यह ज्ञात नहीं है, क्योंकि आदेश परिभाषित नहीं है. परिणामस्वरूप, यह कोड अप्रत्याशित परिणाम देता है, हालाँकि ऐसा नहीं है एन.पी. हालाँकि, जैसा कि मैंने कहा, एक सक्षम प्रोग्रामर ऐसा कोड नहीं लिखेगा, और यह तथ्य कि यह स्ट्रॉस्ट्रुप की पुस्तक में है, इसका मतलब यह नहीं है कि वह ऐसा लिखेगा - उसने सिर्फ एक कॉल श्रृंखला का उदाहरण दिया।

इसके अलावा, कॉल श्रृंखला इतनी स्पष्ट नहीं हो सकती है। उदाहरण के लिए, यहाँ कोड है:

std::cout<< first << second;

यह भी कॉल की एक श्रृंखला है, जो इस प्रकार हो सकती है:

std::cout.operator<<(first).operator<<(second);

या इस तरह:

ऑपरेटर<<(operator<<(std::cout, first), second);

अंतर मौलिक नहीं है. यदि अचानक पहली और दूसरी अभिव्यक्तियाँ किसी तरह एक ही वस्तु को संदर्भित करती हैं, और इनमें से कोई एक अभिव्यक्ति इस वस्तु को संशोधित करती है, तो इस बात की अधिक संभावना है कि हमें आउटपुट पर अस्थिर कोड मिलेगा, या एन.पी.

उपरोक्त वाक्य से एक और दिलचस्प उदाहरण:

एसटीडी::मानचित्र शब्दकोष; शब्दकोश = शब्दकोश.आकार();

हां, कोड निरर्थक लगता है, लेकिन इसका परिणाम क्या होगा? यहां तक ​​कि अर्थहीन कोड को भी पूर्वानुमानित परिणाम देने चाहिए। दुर्भाग्य से, 2014-शैली C++ केवल अपने कंधे उचकाता है - वे कहते हैं, मुझे नहीं पता।

कार्य और संचालक

जब हमने कॉल श्रृंखला को देखा, तो हमने एक और दिलचस्प बिंदु को छुआ: std::cout पर कॉल वास्तव में क्या बदल जाती है<< first << second; . Как мы уже видели, в зависимости от того, чем являются first и second , мы можем получить либо цепочку вызовов функций-членов, либо же вложенные вызовы свободных функций. Но ведь в изначальном варианте записи у нас есть три выражения и 2 оператора << , у нас нет вообще никаких функций!

यह संभावना नहीं है कि इस कोड ने C++ प्रोग्रामर के लिए समस्याएं पैदा कीं: देर-सबेर हम सभी ऑपरेटर ओवरलोडिंग के बारे में सीखते हैं और इसे सब मान लेते हैं, लेकिन इस ओवरलोड में एक बारीकियां है। इस बारीकियों को दिखाने के लिए, आइए निम्नलिखित फ़ंक्शन टेम्पलेट लिखें:

खाका << "first\n", value++) && (cout << "second\n", value++); }

हां, टेम्प्लेट सबसे उपयोगी और उल्लेखनीय नहीं है, लेकिन, जैसा कि हम अब देखेंगे, यह बहुत ही सांकेतिक है। आइए चतुरफन फ़ंक्शन को एक int तर्क के साथ कॉल करें, जो इस फ़ंक्शन को तुरंत चालू करेगा:

बूल क्लेवरफन(इंट&वैल्यू) (रिटर्न (काउट)<< "first\n", value++) && (cout << "second\n", value++); }

जब इस फ़ंक्शन को कॉल किया जाता है, तो आउटपुट की गारंटी होती है:

यदि पहला मान++ 0 लौटाएगा, अन्यथा यह इस प्रकार होगा:

प्रथम, द्वितीय

और कोई अन्य नहीं, जो स्पष्ट है: && ऑपरेटर के लिए एक मजबूत गारंटी है शार्ट सर्किट(केजेड, अंग्रेजी शॉर्ट-सर्किट) और बाईं ओर से दाईं ओर का निष्पादन। दूसरी ओर, यदि हम कुछ प्रकार का Int बनाते हैं जिसके लिए हम पोस्टफ़िक्स ऑपरेटर++ और ऑपरेटर&& दोनों को फिर से परिभाषित करते हैं, और फिर इसके साथ अपने टेम्पलेट को इंस्टेंट करते हैं, तो हमें निम्नलिखित फ़ंक्शन मिलता है:

इंट क्लेवरफन(इंट& वैल्यू) (रिटर्न (काउट)<< "first\n", value.operator++(0)) .operator&&((cout << "second\n", value.operator++(0))); }

मैंने यह बताना शुरू नहीं किया कि कॉउट कॉल का परिणाम क्या होगा, ताकि पहले से ही पढ़ने में बहुत आसान न होने वाले कोड को और अधिक गंदा न किया जाए। अब तक आपने जो देखा है उसके आधार पर, आपको आश्चर्य नहीं होना चाहिए कि इस कोड का आउटपुट सामान्य int से आपको मिलने वाले आउटपुट से भिन्न होगा। यहां आपको 2 विकल्प भी मिल सकते हैं, लेकिन वे अलग-अलग होंगे:

प्रथम, द्वितीय

दूसरा पहला

जाहिर है, हम इस तथ्य के कारण पहले विकल्प नहीं प्राप्त कर सकते हैं कि पुनर्निर्धारित ऑपरेटरों के लिए शॉर्ट सर्किट काम नहीं करता है। यदि आप इस उदाहरण को करीब से देखते हैं, तो आपको यह समझना चाहिए कि: एक ओवरराइड ऑपरेटर को निष्पादित करने के लिए&&, इसके लिए एक तर्क का मूल्यांकन किया जाना चाहिए (यानी शॉर्ट सर्किट को अलविदा), इसके अलावा, शॉर्ट सर्किट केवल तभी काम करता है जब बाईं ओर की अभिव्यक्ति होती है एक बूल, जिसके ओवरराइड होने की स्थिति में कोई ऑपरेटर नहीं हो सकता। इस प्रकार, शॉर्ट सर्किट के बारे में कोई भ्रम नहीं हो सकता है - यह पुनर्निर्धारित ऑपरेटरों के लिए मौजूद नहीं है और न ही कभी होगा।

खैर, कोई शॉर्ट सर्किट नहीं हो सकता है, इसलिए हमें पहला आउटपुट विकल्प (केवल पहला) नहीं मिल सकता है, लेकिन आउटपुट की दो लाइनों वाला विकल्प भी अलग हो भी सकता है और नहीं भी! जरा इसके बारे में सोचें: हमारे पास एक फ़ंक्शन टेम्पलेट के अंदर एक ही कोड है, जो कुछ टेम्पलेट तर्कों के साथ, कुछ नियमों के अनुसार निष्पादित होता है, और दूसरों के लिए, पूरी तरह से अलग नियमों के अनुसार।

यह सब इसलिए है क्योंकि, C++14 में, ऑपरेटरों और उनके ऑपरेंड के लिए गारंटी ऑपरेंड के आधार पर भिन्न होती है। मानक के अनुसार, अभिन्न प्रकारों के लिए, सभी ऑपरेटर काम की गारंटी देते हैं जैसा कि मानक में उनके लिए वर्णित है, लेकिन ओवरराइड ऑपरेटरों के लिए, फ़ंक्शन कॉल को नियंत्रित करने वाले नियम पहले से ही काम करते हैं। वे। ओवरराइड किए गए ऑपरेटरों के लिए, अभिव्यक्ति को कंपाइलर द्वारा फ़ंक्शन कॉल की श्रृंखला में "फिर से लिखा" जाता है, और उसके बाद, ऐसी श्रृंखला के लिए परिभाषित मानक के नियम लागू होते हैं। मानक से कोई भी ऑपरेटर गारंटी ओवरराइड ऑपरेटरों पर लागू नहीं होती है।.

पहले वर्णित हर चीज एक बहुत ही धूमिल तस्वीर पेश करती है: अभिव्यक्तियों के मूल्यांकन के संबंध में C++ में बहुत अधिक अराजकता है। यह कोई आश्चर्य की बात नहीं है कि लोग ऐसी चीजों को सहते हुए थक गए हैं, और शाश्वत कथन कि यह सब कुछ प्रकार के पौराणिक अनुकूलन के लिए आवश्यक है और इसे बदला नहीं जाना चाहिए, को पर्याप्त औचित्य माना जाना बंद हो गया है। सामान्य ज्ञान की जीत हुई और इस गड़बड़ी को साफ़ करने के लिए C++17 में कुछ बदलाव किए गए। और अब हम किस तरह के बदलावों पर विचार कर रहे हैं।

नए आदेश

C++17 द्वारा लाया गया पहला परिवर्तन ऑर्डरिंग है पूर्तिपोस्टफ़िक्स ऑपरेटर, असाइनमेंट ऑपरेटर और बिटवाइज़ शिफ्ट ऑपरेटर। अब सभी पोस्टफ़िक्स ऑपरेटरों, साथ ही बिटवाइज़ शिफ्ट ऑपरेटरों को बाएं से दाएं निष्पादित किया जाता है, जबकि असाइनमेंट ऑपरेटरों को इसके विपरीत, दाएं से बाएं ओर निष्पादित किया जाता है। इस संदर्भ में "निष्पादन" से मेरा मतलब है कि अभिव्यक्ति का मूल्यांकन किया जाता है (यानी, इसका परिणाम लौटाया जाता है), और इसके साथ जुड़े सभी दुष्प्रभाव प्रतिबद्ध हैं।

यह समझाने के लिए कि अभिव्यक्तियाँ अब कैसे क्रमबद्ध हैं, आइए वाक्य से एक उदाहरण लें (नीचे दिए गए उदाहरण में, अभिव्यक्ति a को पहले निष्पादित किया जाता है, फिर b):

A.b a->b a->*b a(b1, b2, b3) b @= a a[b] a<< b a >>बी

जहां @ इस संदर्भ में कोई भी ऑपरेटर मान्य है (जैसे +)। इस प्रकार, नए नियमों के आधार पर, C++11 पर स्ट्रॉस्ट्रुप की पुस्तक में दिया गया उदाहरण अंततः C++17 में सही हो जाता है और हमेशा सही और अपेक्षित परिणाम देगा। जैसा कि आप देख सकते हैं, नए नियम एक-दूसरे के सापेक्ष फ़ंक्शन तर्कों के निष्पादन के क्रम को प्रभावित नहीं करते हैं: उन्हें अभी भी किसी भी क्रम में निष्पादित किया जा सकता है, लेकिन उनका निष्पादन एक-दूसरे के साथ नहीं जुड़ सकता है। दूसरे शब्दों में, वे एक-दूसरे के सापेक्ष क्रमबद्ध हैं, लेकिन क्रम विनियमित नहीं है।

आइए अब कुछ "दिलचस्प" उदाहरण देखें जहां C++14 में हमारे पास था एनपी, लेकिन सी++17 में यह चला गया था। मैं ये उदाहरण केवल अपने उपभोग के लिए देता हूं, मैं आपसे आग्रह करता हूं कि साक्षात्कार में लोगों को इनके साथ प्रताड़ित न करें।

मैं=i++; f(++i, ++i) f(i++, i++) array = i++ i<< i++ cout << i++ << i++

लेकिन ये उदाहरण बने हुए हैं नए मानक में एनपी:

मैं = मैं++ + मैं++ मैं = ++मैं * मैं++

क्योंकि अंकगणित ऑपरेटरों के उप-अभिव्यक्तियों को निष्पादित करने के क्रम को विनियमित करने के लिए कोई नियम नहीं जोड़े गए थे। लेकिन सच तो यह है इन उदाहरणों से एनपी गायब होने का मतलब यह बिल्कुल नहीं है कि यह आपके कोड को समान उदाहरणों से संतृप्त करने का समय है - नहीं। इनमें से प्रत्येक उदाहरण पर सावधानीपूर्वक ध्यान देने और प्रमाण की आवश्यकता है कि ऐसा नहीं है एन.पी. वे। कोई भी प्रोग्रामर जो इस तरह का कोड देखता है, उसे रुकने, याद रखने (या मानक में चढ़ने) के लिए मजबूर किया जाएगा और सुनिश्चित किया जाएगा कि वह अपने सामने सही कोड देखे। कोड "स्मार्ट" नहीं होना चाहिए, कोड समझने योग्य होना चाहिए।इसके अलावा, अभिव्यक्तियों का ऐसा संयोजन वास्तव में बहुत कम देता है।

वैसे, चौकस पाठक ने लाइन कॉउट पर जरूर गौर किया होगा<< i++ << i++ в вышеприведённых примерах, и если он не знает обо всех правилах и поверил автору, то он наверняка воспользовался такой логикой: пример переписывается как

cout.ऑपरेटर<<(i++).operator<<(i++)

जिसके बाद नए नियम. तो कोड नहीं है एन.पी. ऐसा तर्क तर्कसंगत तो लगता है, लेकिन पूरी तरह सच नहीं। वास्तव में, सब कुछ सरल है: उदाहरण वास्तव में मेरे द्वारा दिए गए संकलक द्वारा "पुनः लिखा" गया है, लेकिन निष्पादन आदेश पुनर्लेखन से पहले बनाया गया है! वे। नये नियमों के अनुसार अतिभारित ऑपरेटर अंतर्निहित ऑपरेटरों के लिए निष्पादन नियमों का पालन करते हैं, कम से कम उस क्रम के संदर्भ में जिसमें उपअभिव्यक्तियों का मूल्यांकन किया जाता है। इसलिए, इस तथ्य के आधार पर कि ऑपरेटर का बायाँ ऑपरेंड<< вычисляется до правого у нас и нет कोड में एनपी.

यह पता चला है कि अब हमारे पास उस क्रम में कोई विसंगति नहीं है जिसमें अंतर्निहित और अतिभारित ऑपरेटरों के लिए अभिव्यक्ति निष्पादित की जाएगी, और पिछले अनुभाग से हमारा उदाहरण:

खाका बूल क्लेवरफन (टी एंड वैल्यू) (रिटर्न (काउट)<< "first\n", value++) && (cout << "second\n", value++); }

किसी भी प्रकार के लिए हमेशा पहले पहले आउटपुट होगा और फिर दूसरा। आउटपुट के विपरीत क्रम को अब मानक द्वारा बाहर रखा गया है। निस्संदेह, यह एक बहुत ही महत्वपूर्ण नवाचार है जो आपको लिखे गए कोड के बारे में तर्क करने की अनुमति देता है, न कि इससे क्या उत्पन्न होगा इसके बारे में। यह ध्यान रखना दिलचस्प है कि इस नवाचार ने एक अतिभारित ऑपरेटर के स्पष्ट और अंतर्निहित आह्वान के बीच अंतर पैदा किया। एक उदाहरण पर विचार करें:

#शामिल करना नेमस्पेस एसटीडी का उपयोग करना; क्लास समक्लास (मित्र इंट ऑपरेटर<<(const SomeClass& obj, int&); public: SomeClass(int var): m_Var{var} { } private: int m_Var; }; int operator<<(const SomeClass& obj, int& shift) { return obj.m_Var << shift; } int main() { int i = 0; int result = SomeClass{i = 1} << (i = 2); cout << "First result: " << result << "\n"; result = operator<<(SomeClass{i = 1}, i = 2); cout << "Second result: " << result << "\n"; };

पहला परिणाम 4 होने की गारंटी है, जबकि दूसरा 2 या 4 हो सकता है। यह उदाहरण C++17 में एक अतिभारित ऑपरेटर के स्पष्ट और अंतर्निहित आह्वान के बीच अंतर को अच्छी तरह से दिखाता है।

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

हालाँकि मैंने स्ट्रॉस्ट्रुप की पुस्तक में कोड के बारे में कुछ "फाई" कहा था, मैं चेनिंग-विरोधी से बहुत दूर हूं, और यदि हम अनिवार्य भाषाओं का उपयोग करके लिखे गए आधुनिक कोड को देखें, तो हम देख सकते हैं कि इसमें अधिक से अधिक चेन शामिल हैं (उदाहरण के लिए, LINQ और Task+ContinueWith C# से, या Lodash/अंडरस्कोर और Promise+फिर JS से)। C++ भी उस दिशा में आगे बढ़ रहा है, और हम जल्द ही भविष्य के C++ मानकों में रेंज-v3 और भविष्य+फिर उपरोक्त उदाहरणों के समकक्ष देखेंगे। लेकिन नए मानकों के जारी होने से पहले भी, हम विभिन्न पुस्तकालयों का उपयोग कर सकते हैं जिनका इंटरफ़ेस कॉल श्रृंखला के उपयोग को प्रोत्साहित करता है।

कुल मिलाकर, मेरी राय में, अभिव्यक्तियों के मूल्यांकन के नियमों में बदलाव C++17 में सबसे महत्वपूर्ण नवाचारों में से एक है जिसे बहुत कम लोग नोटिस करेंगे, क्योंकि हर चीज (या लगभग हर चीज) उसी तरह से काम करेगी जिस तरह से उसे काम करना चाहिए। सामान्य ज्ञान के लिए. और C++ मानक में हर दिन अधिक से अधिक सामान्य ज्ञान होता जा रहा है।

नकल को न्यूनतम करना

C++ सीखने में पहला कदम कॉपी कंस्ट्रक्टर को सीखना है। आख़िरकार, इसकी मदद से आप आसानी से यह निर्धारित कर सकते हैं कि क्या और कब कॉपी किया गया है। वे। हम अपनी खुद की क्लास लिखते हैं, वहां एक कॉपी कंस्ट्रक्टर जोड़ते हैं, जिसमें हम cout के माध्यम से आउटपुट लिखते हैं, और आउटपुट का आनंद लेते हैं, जिसके परिणामस्वरूप हमें पता चलता है कि हमने कितनी प्रतियां बनाई हैं।

मूव सिमेंटिक्स के आगमन के साथ, स्थिति कुछ अधिक जटिल हो गई है, इसलिए पूर्णता के लिए, अब हमें एक मूव कंस्ट्रक्टर बनाने की भी आवश्यकता है। लेकिन इस वर्ग के लिए यह कोई मायने नहीं रखता, क्योंकि. निम्नलिखित सभी प्रतिलिपि बनाने और स्थानांतरित करने दोनों के लिए सत्य हैं।

उदाहरण के लिए, आइए निम्नलिखित कोड लिखें:

#शामिल करना नेमस्पेस एसटीडी का उपयोग करना; क्लास कुछक्लास (सार्वजनिक: कुछक्लास() = डिफ़ॉल्ट; कुछक्लास(कास्ट कुछक्लास&) ( कोउट<< "Copy ctor called.\n"; } }; SomeClass meReturn() { return SomeClass{}; } int main() { auto some = meReturn(); };

यदि हम इस कोड को एक कंपाइलर पर बनाते हैं जो C++14 लागू करता है और प्रोग्राम चलाता है तो स्क्रीन पर "कॉपी ctor कॉल किया गया" वाक्यांश कितनी बार दिखाई देगा? शून्य, एक, या शायद दो बार? सही उत्तर: अज्ञात.

जिनके लिए उत्तर आश्चर्यचकित करने वाला था, वे स्पष्टीकरण के पात्र हैं, जिस पर अब हम विचार करते हैं। तो, शुरुआत के लिए, आइए मानक को उजागर करें और विचार करें कि यहां प्रतियों की अधिकतम संख्या क्या है शायदबनाया जाए. यहां प्रतियों की सबसे बड़ी संभावित संख्या संख्या 2 है: पहली प्रतिलिपि तब बनाई जाती है जब रिटर्न स्टेटमेंट निष्पादित किया जाता है, और दूसरी प्रतिलिपि तब बनाई जाती है जब कुछ ऑब्जेक्ट का निर्माण किया जाता है। लेकिन यदि आप इस कोड को कमोबेश आधुनिक कंपाइलर (कोई अतिरिक्त स्विच नहीं!) पर चलाते हैं, तो आपको दोहरा आउटपुट देखने की संभावना नहीं है; अधिक संभावित परिणाम या तो एक पंक्ति है, या कोई आउटपुट ही नहीं है। अब हम अपने फ़ंक्शन के कोड को थोड़ा संशोधित करेंगे, यह दूसरा विकल्प होगा:

कुछक्लास मुझेरिटर्न() (कुछक्लासकुछ();कुछ लौटाओ; )

यदि हम इस कोड को लोकप्रिय कंपाइलरों पर निष्पादित करते हैं, तो आउटपुट बदल भी सकता है और नहीं भी (यह एमएसवीसी 2017 पर डिबग मोड में बदलता है)। अंत में, हम फ़ंक्शन के कोड को थोड़ा और बदल देंगे, केवल इस बार आउटपुट बदलने की गारंटी है (पहले विकल्प के सापेक्ष और कंपाइलरों के साथ चीजों की वर्तमान स्थिति को ध्यान में रखते हुए):

कुछक्लास मुझेरिटर्न() (कुछक्लास कुछ(); यदि (झूठा) कुछक्लास लौटाओ(); कुछ लौटाओ; )

तो, फ़ंक्शन अनिवार्य रूप से सभी वेरिएंट में समान है, लेकिन व्यवहार अलग है - वैसे भी यहाँ क्या चल रहा है? प्रारंभ करें। C++ मानक के अनुसार, कुछ मामलों में कंपाइलर किसी ऑब्जेक्ट की प्रतिलिपि नहीं बना सकता है; इस स्थिति को कहा जाता है कॉपी छोड़ें(पीसी, अंग्रेजी कॉपी एलिजन)। सुविधाओं की एक पूरी (बल्कि संक्षिप्त) सूची जिसका उपयोग यह निर्धारित करने के लिए किया जा सकता है कि कॉपी स्किपिंग की अनुमति है या नहीं, class.copy/p31 में वर्णित है। हम दो समान, लेकिन फिर भी भिन्न स्थितियों में रुचि रखते हैं।

मूल उदाहरण में, हमारा फ़ंक्शन एक अस्थायी रिटर्न देता है बेनामएक वस्तु। ऐसी स्थिति में, कंपाइलर दोनों प्रतियों को छोड़ने और कुछ में सीधे ऑब्जेक्ट बनाने के लिए स्वतंत्र है। इस स्थिति को लोकप्रिय रूप से जाना जाता है वापसी मूल्य अनुकूलन(ओवीजेड, इंजी. वापसी मूल्य अनुकूलन)। यदि हम gcc/clang/MSVC को देखें तो हम देख सकते हैं कि ऐसे फ़ंक्शन के लिए उन्हें दोनों प्रतियों से छुटकारा मिल जाता है और इसलिए आउटपुट खाली होगा।

इस अनुकूलन की अनुमति न केवल रिटर्न के लिए है, बल्कि अन्य स्थानों के लिए भी है जहां एक अस्थायी, अनाम ऑब्जेक्ट के साथ आरंभीकरण होता है। इसलिए, यदि आपके पास एक void meAccept(SomeClass) फ़ंक्शन है जिसे meAccept(SomeClass()) जैसा कहा जाता है, तो कंपाइलर अनावश्यक प्रतिलिपि को छोड़ने के लिए स्वतंत्र है।

अब दूसरे विकल्प पर चलते हैं, जहां हमने बनाया था नामस्टैक पर वस्तु. जीसीसी/क्लैंग के लिए आउटपुट नहीं बदला है, लेकिन एमएसवीसी (डीबग मोड में) के लिए आउटपुट में एक लाइन दिखाई दी है, यह स्पष्ट है कि इस मामले में एमएसवीसी को केवल दूसरी कॉपी से छुटकारा मिला है। पूर्वगामी के आधार पर, यह स्पष्ट हो जाता है कि कंपाइलर भी पीसी का उपयोग करता है, लेकिन यहां यह थोड़ा अलग मानदंड के अनुसार होता है: उसे नकल से छुटकारा पाने का अधिकार है नामस्टैक पर ऑब्जेक्ट जो फ़ंक्शन से लौटाया जाता है। इस अनुकूलन को लोकप्रिय रूप से जाना जाता है नामित वापसी मूल्य अनुकूलन(OIVZ, जिसका नाम रिटर्न वैल्यू ऑप्टिमाइज़ेशन है)।

कंपाइलर के लिए इस अनुकूलन को निष्पादित करना अधिक कठिन है, जिसे हम तीसरे विकल्प में देखते हैं, जहां हमने एक बिल्कुल बेकार if जोड़ा है, जिसने सभी तीन मुख्य कंपाइलरों को पास करने और एक प्रतिलिपि बनाने के लिए मजबूर किया है। इस प्रकार, OIV साधारण OIV की तुलना में अधिक "भंगुर" अनुकूलन है, और जब कोड में कई अलग-अलग रिटर्न होते हैं तो यह आम तौर पर अक्षम हो जाता है। यह उन तर्कों में से एक है कि किसी फ़ंक्शन में केवल एक रिटर्न क्यों होना चाहिए (मैं यह नहीं कह सकता कि तर्क बहुत ठोस है)।

एक दिलचस्प तथ्य यह है कि उपरोक्त अनुकूलन कंपाइलरों में तब भी लागू होते हैं जब हम अक्षम अनुकूलन (-O0, /Od) के साथ संकलित करते हैं। इसके अलावा, केवल जीसीसी और क्लैंग को ही सभी प्रतियां बनाने के लिए बाध्य किया जा सकता है। ऐसा करने के लिए आपको -fno-elide-constructors स्विच का उपयोग करने की आवश्यकता है, और MSVC किसी भी परिस्थिति में दो प्रतियां नहीं बनाएगा, और इस व्यवहार को अक्षम करने के लिए कोई [सार्वजनिक] स्विच नहीं हैं।

एक और बात है जिसका उल्लेख किया जाना चाहिए। हालाँकि C++14 में कंपाइलर दोनों प्रतियों को हटा सकता है, जिससे कॉपी कंस्ट्रक्टर को एक बार भी निष्पादित नहीं किया जा सकता है, यदि ऐसा कोई कंस्ट्रक्टर नहीं है तो इसे एक संकलन त्रुटि उत्पन्न करनी चाहिए। वे। यदि हम मौजूदा कॉपी कंस्ट्रक्टर के स्थान पर इसे लिखते हैं: कुछक्लास(स्थिरांक कुछक्लास&) = हटाएं, तो प्रोग्राम तब भी नहीं बनेगा जब कंपाइलर कानूनी तौर पर नकल से छुटकारा पा सकते हैं - कंस्ट्रक्टर को अभी भी होना चाहिए।

और अंत में, तीसरा बिंदु: आंदोलन। यदि कंपाइलर प्रतिलिपि को छोड़ सकता है, तो वह स्थानांतरण को भी छोड़ सकता है। वे। इस संबंध में वे बिल्कुल समकक्ष हैं। वैसे, इस संबंध में एक दिलचस्प स्थिति जुड़ी हुई है। कई प्रोग्रामर (मैं नेट पर देखे गए कोड के आधार पर कई के बारे में निष्कर्ष निकालता हूं) इस तरह के कोड को स्थानांतरित करने और लिखने के शब्दार्थ को ठीक से नहीं समझते हैं: return std::move(someObject) । दिखने में, यह कोड बिल्कुल हानिरहित है और इसे लिखने वाले की अपेक्षा के अनुरूप ही यह कोड काम करता है गारंटी OIVZ को बंद कर देता है। क्या आपको लगता है कि एक सस्ता मूव कंस्ट्रक्टर बनाना बेहतर है या कुछ भी नहीं करना?

नई वास्तविकता

अब यह विचार करने का समय है कि पीसी के संबंध में C++17 में क्या बदलाव आया है। इस अनुभाग में हम जिन परिवर्तनों पर चर्चा करेंगे वे सभी मूल P0135R1 प्रस्ताव में पाए जा सकते हैं। यदि आप इस दस्तावेज़ पर नज़र डालें, तो आप देखेंगे कि यह अभिव्यक्तियों की श्रेणी (अधिकतर) के संदर्भ में मानक में कई परिवर्तनों का वर्णन करता है कीमत), साथ ही विभिन्न संपादन यह स्पष्ट करते हैं कि आपको कहां स्पष्ट रूप से निष्पादित करने की आवश्यकता है प्रत्यक्ष(प्रत्यक्ष-) और नकल(कॉपी-) आरंभीकरण। इस पूरे सेट में से, हम केवल एक बदलाव में रुचि रखते हैं, जिसका वर्णन stmt.return/p2 में किया गया है।

तो, उपरोक्त नवाचार के अनुसार, किसी फ़ंक्शन से उसी प्रकार की एक अस्थायी अनाम वस्तु (प्रचलन) को वापस करना (यानी कोई रूपांतरण आवश्यक नहीं) क्योंकि फ़ंक्शन का रिटर्न प्रकार परिणाम की प्रतिलिपि-प्रारंभिकरण करता है (जो, डीसीएल के अनुसार)। init/p(17.6.1) , आपको नकल छोड़ने की अनुमति देता है)। उपरोक्त वाक्य में लिखा गया मूलतः वही HIA है, केवल इस बार अनिवार्य. वे। यदि C++14 कंपाइलर में सकनाऐसे में अब कॉपी/मूव से छुटकारा पाएं अवश्यइसे करें। इससे हमें क्या मिलता है, क्योंकि हम पहले ही देख चुके हैं कि कंपाइलर स्वयं बहुत अच्छा काम करता है? और हमें निम्नलिखित देता है, इस कोड के साथ:

कुछ क्लास meReturn() ( कुछ क्लास वापस करो(); )

हमारे पास कोई कॉपी और मूव कंस्ट्रक्टर नहीं हो सकता है और यह अभी भी संकलित होगा। यह ध्यान रखना महत्वपूर्ण है कि केवल मामला तब बदला है जब एक अस्थायी अनाम ऑब्जेक्ट से कोई अन्य ऑब्जेक्ट बनाया गया है, लेकिन यदि हम एक नामित ऑब्जेक्ट (OIVZ) लौटाते हैं, तो भले ही कंपाइलर प्रतिलिपि बनाना छोड़ सकता है, एक उपयुक्त कंस्ट्रक्टर की उपस्थिति आवश्यक है .

एक और चीज़ है जो पहले से ही तर्क पारित करने से संबंधित है, न कि वापसी मूल्यों से। यदि हमारे पास यह कोड है:

शून्य मुझे स्वीकार करें([] कुछक्लास s) ( )

फिर, जब meAccept(SomeClass()) फ़ंक्शन को कॉल किया जाता है, तो कोई प्रतिलिपि नहीं होगी, और यह फिर से एक अनुकूलन नहीं है, बल्कि मानक की एक आवश्यकता है। यह प्रचलन ( basic.lval ) की परिभाषा और उस परिवर्तन में क्या शामिल है, में बदलाव के कारण है। आइए इस पंक्ति को तोड़ें: meAccept(SomeClass()) । पुराने प्रचलन के संदर्भ में, SomClass() एक अस्थायी ऑब्जेक्ट है, जिसे बाद में फ़ंक्शन पैरामीटर में कॉपी किया जाता है। लेकिन प्रचलन की नई परिभाषा यह है कि अब वह नहीं है एक वस्तु, लेकिन अभिव्यक्ति, जिसका मूल्यांकन वस्तु का आरंभीकरण है। हमारे लिए इसका क्या मतलब है? इसका मतलब यह है कि जिस अभिव्यक्ति पर हम विचार कर रहे हैं, उसमें SomClass() एक अस्थायी वस्तु नहीं है, बल्कि एक फ़ंक्शन पैरामीटर आरंभीकरण अभिव्यक्ति है। यहां dcl.init/p(17.6.1) में वर्णित हमारे द्वारा पहले से उल्लिखित नियम शामिल है, और कोई प्रतिलिपि नहीं होती है - आरंभीकरण सीधे किया जाता है।

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

lambdas

समिति लैम्ब्डा के प्रति अपना प्यार दिखाती रहती है और मानक के प्रत्येक नए संशोधन में उनमें कुछ नया जोड़ती है। 2017 कोई अपवाद नहीं था, और लैम्ब्डा को नवाचारों का अपना हिस्सा प्राप्त हुआ। हालाँकि मैं एक संक्षिप्त सिंटैक्स (जैसे C# का x => x ) की प्रतीक्षा करता रहता हूँ और इस मानक के नवाचारों को मामूली मानता हूँ, फिर भी मैं उनसे बच नहीं पाता हूँ।

इस पर कब्जा कर रहे हैं

तो, पहला नवाचार. अब आप इस पॉइंटर का उपयोग करके किसी ऑब्जेक्ट की एक कॉपी को कैप्चर सूची में पास कर सकते हैं। C++17 से पहले, यदि हम वर्तमान ऑब्जेक्ट की एक प्रति लैम्ब्डा में पास करना चाहते थे, तो हमें कुछ इस तरह लिखने के लिए मजबूर किया जाता था:

#शामिल करना नेमस्पेस एसटीडी का उपयोग करना; क्लास समक्लास (सार्वजनिक: सोमक्लास(आकार_t मान): m_Value(मान) ( ​​) शून्य someMethod() ( ऑटो लैम्ब्डा = [_यह = *यह] ( for(size_t i = 0; i< _this.m_Value; ++i) cout << "This is lambda!!!\n"; }; lambda(); } private: size_t m_Value; }; int main() { SomeClass some{3}; some.someMethod(); };

इस दृष्टिकोण का मुख्य नुकसान उस ऑब्जेक्ट का नाम स्पष्ट रूप से निर्दिष्ट करने की आवश्यकता है जिसमें हमने *यह कॉपी किया है, हर बार इसे एक्सेस करने पर। C++17 आपको इस तरह लिखने की अनुमति देकर इस कमी को ठीक करता है:

ऑटो लैम्ब्डा = [*यह] (for(size_t i = 0; i< m_Value; ++i) cout << "This is lambda!!!\n"; };

वे। ऑब्जेक्ट के सदस्यों तक पहुंच बिल्कुल उसी तरह से की जाती है जैसे कि हमने ऐसी कैप्चर सूची के साथ एक लैम्ब्डा बनाया है, लेकिन इस मामले में, वर्तमान ऑब्जेक्ट (यानी यह पॉइंटर) नहीं, बल्कि इसकी प्रतिलिपि लैम्ब्डा को दी जाती है . मैं यह नोट करना चाहूंगा कि मुझे ऐसा कोड नहीं लिखना पड़ा है, इसलिए मेरे लिए नवाचार की उपयोगिता का आकलन करना मुश्किल है, लेकिन यह स्पष्ट रूप से किसी के लिए जीना आसान हो जाएगा। मैं केवल उनके लिए खुश हो सकता हूं और अगले नवाचार की ओर बढ़ सकता हूं।

अधिक स्थिरता की आवश्यकता है!

एक और बदलाव जिसकी लंबे समय से मांग की जा रही थी, वह है निरंतर अभिव्यक्तियों में लैम्ब्डा का उपयोग करने की क्षमता को जोड़ना। निःसंदेह, ऐसे लंबोदर भी स्थिर होने चाहिए। उदाहरण के लिए:

ऑटो ग्यारह = (वापसी 11; ); सरणी गिरफ्तार;

जैसा कि आप देख सकते हैं, लैम्ब्डा की परिभाषा में कुछ भी नहीं बदला है, लेकिन इसकी कॉल का उपयोग उस संदर्भ में किया जाता है जहां संकलन-समय स्थिरांक के उपयोग की आवश्यकता होती है। क्योंकि यह कोड सफलतापूर्वक संकलित होता है, कोई भी सावधान प्रोग्रामर यह निष्कर्ष निकाल सकता है कि लैम्ब्डा से उत्पन्न क्लास का ऑपरेटर () एक कॉन्स्टेक्सपीआर सदस्य है, और यह निष्कर्ष निस्संदेह सही है। C++17 के बाद से, सभी लैम्ब्डा एक्सप्रेशन डिफ़ॉल्ट रूप से constexpr हैं, जबकि C++17 से पहले वे केवल const थे। लेकिन यदि लैम्ब्डा फ़ंक्शन का मुख्य भाग कम से कम एक मानदंड को पूरा नहीं करता है जिसका सभी कॉन्स्टेक्सपीआर फ़ंक्शन पालन करते हैं (मानदंड dcl.constexpr में वर्णित हैं) तो उन्हें कॉन्स्ट में स्थानांतरित कर दिया जाएगा। आइए अपने कोड में न्यूनतम परिवर्तन करें, और लैम्ब्डा अब constexpr नहीं रहेगा:

ऑटो ग्यारह = (int x; वापसी 11; );

ऐसे लैम्ब्डा के साथ, सरणी निर्माण कोड एक संकलन त्रुटि देगा (जो कि हम वास्तव में चाहते थे), लेकिन लैम्ब्डा का निर्माण स्वयं कोई त्रुटि नहीं देगा। हालाँकि, हम शिकंजा कस सकते हैं और लैम्ब्डा को एक ऐसी बॉडी की आवश्यकता होती है जो उपरोक्त नियमों का पालन करती हो:

ऑटो ग्यारह = () constexpr (int x; वापसी 11; );

ध्यान दें कि हमें स्पष्ट constexpr और () दोनों को जोड़ना था, जो कोई कार्यात्मक भार नहीं लेता है और केवल मानक की इच्छा को पूरा करता है। इस प्रकार, हम लैम्ब्डा फ़ंक्शंस बना सकते हैं जो कि कॉन्स्टेक्सपीआर संदर्भ में प्रयोग करने योग्य होने की गारंटी है।

यह परिवर्तन लंबे समय से सुझाया गया है, और किसी को आश्चर्य नहीं होना चाहिए: सरल कार्य constexpr हो सकते हैं, सदस्य कार्य भी हो सकते हैं, लैम्ब्डा बदतर क्यों हैं? कॉन्स्टेक्सपीआर लैम्ब्डा कितने आवश्यक हैं? यह और भी दिलचस्प सवाल है. मुझे लगता है कि constexpr कोड को उनकी उतनी ही आवश्यकता है जितनी सरल कोड को। अभी C++ में कॉन्स्टेक्सपीआर बूम है: लोग यह देखने के लिए प्रतिस्पर्धा कर रहे हैं कि रनटाइम से कंपाइल टाइम तक काम को आगे बढ़ाने में कौन आगे बढ़ सकता है।

वे JSON पार्सर लिखने और यहां तक ​​कि नियमित अभिव्यक्ति निष्पादित करने तक जाते हैं (जो रुचि रखते हैं, उनके लिए CppCon2017 से वीडियो देखें: "कॉन्स्टेक्सपीआर ऑल द थिंग्स!"). इसके अलावा, अधिक से अधिक मानक (और ऐसा नहीं) एल्गोरिदम constexpr बन रहे हैं, जो लैम्ब्डा के सबसे स्पष्ट उपयोग को जन्म देता है, क्योंकि वे केवल एल्गोरिदम के लिए बनाए गए हैं। इसलिए, मेरी राय में, constexpr को जोड़ना एक अच्छा कदम है, जो आपको अधिक कोड लिखने की अनुमति देगा जो संकलन समय पर निष्पादित किया जाएगा।

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

दो दोस्त मिलते हैं:

- मैंने सुना है कि आपने एक कार खरीदी है?

- हाँ! और वह कैसे रहता था! अब मैं सब कुछ कर सकता हूँ! कल मैं एक दिन में तेल बदलने में कामयाब रहा, नए टायर खरीदे, फ़ेंडर के लिए कार बाज़ार गया, तुरंत कार सेवा में गया और उन्हें बदल दिया, और एंटी-फ़्रीज़ के लिए स्टोर पर भी गया। बिना कार के मैं यह सब कैसे कर सकता था?

मुझे इस बात पर आपत्ति हो सकती है कि JSON अधिक सुविधाजनक है। जाने भी दो। तो फिर आइए उसी पायथन (या सामान्य रूप से CMake) में एक स्क्रिप्ट जोड़ें, जो हमारे लिए JSON से एक कॉन्फ़िगरेशन ऑब्जेक्ट उत्पन्न करेगा। हाँ, हमें अपना प्रोजेक्ट बनाने के लिए एक और कदम जोड़ना होगा, लेकिन क्या यह JSON को पार्स करने वाले C++ कोड को लिखने से अधिक कठिन है? और किसी ने संकलन समय रद्द नहीं किया (और मुझे लगता है कि यह कारण बहुत अधिक महत्वपूर्ण है): यदि कोड को संकलित करने में लंबा समय लगता है, तो विकास नरक में बदल जाएगा। इसलिए मुझे जटिल सामग्री को कॉन्स्टेक्सपीआर रेल्स में पोर्ट करने का कोई मतलब नहीं दिखता। मेरी राय में, यह एक अनावश्यक जटिलता है जिसे सम्मेलनों में दिखाया जा सकता है, लेकिन वास्तविक कोड में यह पूरी तरह से अनावश्यक है। संकलन-समय गणनाओं का उपयोग उचित होना चाहिए, सिर्फ इसलिए नहीं कि "अब हम कर सकते हैं!"।

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

किसी भी समझ से बाहर की स्थिति में, शांत हो जाएं, लेट जाएं, अपने आप को गले लगाएं, जाएं और स्वादिष्ट व्यंजन खाएं। अपनी नसों का ख्याल रखें :)

गलतियों को अतीत में छोड़ दो.

असली की सराहना करें.

भविष्य के लिए मुस्कुराएं

जैसे ही आप उस स्थिति को जाने देते हैं जो आपको पीड़ा देती है, स्थिति तुरंत आपको जाने देगी।




घबराओ मत. पता नहीं आपकी अनुपस्थिति में क्या हो जाये.

पेड़ के पास आओ. यह तुम्हें शांति सिखाये।

आपके मन की शांति का रहस्य क्या है?

"अपरिहार्य की पूर्ण स्वीकृति में," मास्टर ने उत्तर दिया।

अपने विचारों में चीज़ों को क्रम में रखें - और आप दुनिया को अलग आँखों से देखेंगे।

अपने दिल को साफ करना मत भूलना.

आराम क्या है?

कोई अनावश्यक विचार नहीं.

और कौन से विचार अनावश्यक हैं?

(वेई ते-हान)

आपका सबसे महत्वपूर्ण खजाना आपकी आत्मा में शांति है।

कैमोमाइल सुखदायक है.

अपने मूड को संभालें, क्योंकि अगर वह नहीं मानता तो आज्ञा देता है।


आप केवल एक पर्यवेक्षक बनकर, शांति से जीवन के क्षणभंगुर पाठ्यक्रम को देखकर ही शांति पा सकते हैं। इरविन यालोम



शांति भावनाओं से अधिक मजबूत है.

खामोशी चीखने-चिल्लाने से ज़्यादा तेज़ होती है।

और तुम्हारे साथ कुछ भी हो, किसी भी बात को दिल पर मत लेना। दुनिया में थोड़ा भी लंबे समय तक महत्वपूर्ण है।

एरिच मारिया रिमार्के "आर्क डी ट्रायम्फ" ---

जब आप बारिश में फंस जाएं तो आप इससे एक उपयोगी सबक सीख सकते हैं। यदि अप्रत्याशित रूप से बारिश होने लगती है, तो आप भीगना नहीं चाहते, इसलिए आप सड़क से होते हुए अपने घर की ओर भागते हैं। लेकिन जब आप घर पहुंचते हैं, तो आप देखते हैं कि आप अभी भी भीगे हुए हैं। यदि आप शुरू से ही तय कर लें कि अपनी गति तेज़ नहीं करनी है, तो आप भीग जायेंगे, लेकिन आप परेशान नहीं होंगे। अन्य समान परिस्थितियों में भी ऐसा ही किया जाना चाहिए।

यामामोटो त्सुनेटोमो - हागाकुरे। समुराई किताब



कल वही होगा जो होना चाहिए

और ऐसा कुछ भी नहीं होगा जो नहीं होना चाहिए -

उपद्रव मत करो.

यदि हमारे भीतर शांति नहीं है तो उसे बाहर खोजना व्यर्थ है।

चिंताओं से मुक्त -
जीवन का आनंद लेता है.
पाना खुश नहीं है
हारने पर दुःख नहीं होता, क्योंकि वह जानता है
वह भाग्य स्थायी नहीं है.
जब हम चीजों से बंधे नहीं हैं
शांति पूरी तरह से ज्ञात है.
यदि शरीर को तनाव से आराम नहीं मिलता है,
यह घिस जाता है।
यदि आत्मा सदैव चिंता में रहती है,
वह फीका पड़ जाता है.

चुआंग त्ज़ु ---

यदि आप किसी कुत्ते को छड़ी फेंकेंगे तो वह इस छड़ी को देखेगा। और यदि तुम सिंह के पास छड़ी फेंकोगे तो वह बिना ऊपर देखे फेंकने वाले की ओर ही देखेगा। यह एक औपचारिक वाक्यांश है जो प्राचीन चीन में विवादों के दौरान कहा जाता था, यदि वार्ताकार शब्दों से चिपकना शुरू कर देता और मुख्य बात देखना बंद कर देता।

जब मैं सांस लेता हूं तो मैं अपने शरीर और दिमाग को शांत करता हूं।
जैसे ही मैं साँस छोड़ता हूँ, मैं मुस्कुराता हूँ।
वर्तमान क्षण में रहते हुए, मैं जानता हूं कि यह क्षण अद्भुत है!

अपने आप को गहरी सांस लेने दें और अपने आप को एक ढांचे में न बांधें।

ताकत उन लोगों की है जो अपनी ताकत पर विश्वास करते हैं।

आत्म-अवलोकन के माध्यम से अपनी मानसिक-भावनात्मक स्थिति की निगरानी करने की आदत विकसित करें। अपने आप से नियमित रूप से पूछना अच्छा है: "क्या मैं इस समय शांत हूँ?" यह एक ऐसा प्रश्न है जो स्वयं से नियमित रूप से पूछना उपयोगी है। आप यह भी पूछ सकते हैं: "इस समय मेरे अंदर क्या चल रहा है?"

एकहार्ट टॉले

चिंता से मुक्ति ही मुक्ति है। यह महसूस करते हुए कि आप परिणामों को प्रभावित नहीं कर सकते, अपनी इच्छाओं और डर पर ध्यान न दें। उन्हें आने दो और जाने दो. उन्हें रुचि और ध्यान से न खिलाएं. वास्तव में, चीजें आपके साथ की जाती हैं, आपसे नहीं।

निसर्गदत्त महाराज


एक व्यक्ति जितना शांत और संतुलित होता है, उसकी क्षमता उतनी ही अधिक शक्तिशाली होती है और अच्छे और योग्य कार्यों में उसकी सफलता उतनी ही अधिक होती है। मन की समता बुद्धि के सबसे बड़े खज़ानों में से एक है।


समस्त ज्ञान का आधार शांति और धैर्य है।

अपनी चिंता छोड़ें और फिर आप शानदार पैटर्न देख सकते हैं...

जब मन शांत हो जाता है, तो आप चंद्रमा की रोशनी और हवा की सांस की सराहना करने लगते हैं, और आप समझ जाते हैं कि सांसारिक उपद्रव की कोई आवश्यकता नहीं है।

अपनी आत्मा में शांति पाएं, और आपके आस-पास के हजारों लोग बच जाएंगे।

आप वास्तव में शांति और प्रेम चाहते हैं। तुम उनमें से निकले हो, तुम उन्हीं के पास लौटोगे और तुम वही हो। पापाजी


सबसे सुंदर और स्वस्थ लोग वे लोग होते हैं जो किसी भी बात से नाराज़ नहीं होते।


बाहरी तूफ़ानों के बावजूद शांत रहने की क्षमता मानव ज्ञान की उच्चतम डिग्री है।



आप अपने अनुभवों से बंधे नहीं हैं, बल्कि उनसे चिपके हुए हैं।

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

जब आप पहाड़ी जंगलों और पत्थरों पर बहते झरनों का चिंतन करते हैं, तो सांसारिक गंदगी से घिरा हृदय धीरे-धीरे साफ हो जाता है। जब आप प्राचीन सिद्धांतों को पढ़ते हैं और प्राचीन गुरुओं के चित्रों को देखते हैं, तो सांसारिक अश्लीलता की भावना धीरे-धीरे समाप्त हो जाती है। होंग ज़िचेंग, जड़ों का स्वाद।


बुद्धि शांत रहने की क्षमता से आती है। बस देखो और सुनो. और कुछ नहीं चाहिए. जब आप शांति में होते हैं, जब आप सिर्फ देखते और सुनते हैं, तो यह आपके भीतर आपकी अवधारणा-मुक्त बुद्धि को सक्रिय करता है। शांति को आपके शब्दों और कार्यों का मार्गदर्शन करने दें।

एकहार्ट टॉले


हम बाहरी दुनिया में तब तक शांति नहीं पा सकते जब तक हम इसे आंतरिक दुनिया में हासिल नहीं कर लेते।

संतुलन का सार चिपकना नहीं है।

विश्राम का सार पीछे न हटना है।

स्वाभाविकता का सार प्रयास करना नहीं है।

जो ईर्ष्यालु नहीं है और किसी का अहित नहीं चाहता, उसने संतुलन प्राप्त कर लिया है। उसके लिए सारा संसार खुशियों से भर जाता है।

जीवन को फिर से खिलने, रोमांचित करने और रोमांचक आनंद और खुशियों से भरने के लिए, आपको बस रुकने की जरूरत है... रुकें और खुद को आनंद में घुलने दें...

अपने भविष्य के बारे में चिंता न करें, अभी शांति रखें और सब कुछ ठीक हो जाएगा।

यदि पानी को हिलाया न जाए तो वह अपने आप बैठ जाएगा। यदि दर्पण गंदा नहीं है तो वह प्रकाश को अपने आप परावर्तित कर देगा। मानव हृदय को इच्छा से शुद्ध नहीं किया जा सकता। जो इसे प्रदूषित करता है उसे हटा दें, और इसकी पवित्रता स्वयं प्रकट हो जाएगी। आनंद अपने से बाहर नहीं पाया जा सकता। जो चीज़ आपको चिंता देती है उसे ख़त्म कर दें, और ख़ुशी आपकी आत्मा में अपने आप राज कर लेगी।


कभी-कभी चीजों को यूं ही छोड़ दें...

तूफ़ान के केंद्र में यह हमेशा शांत रहता है। केंद्र में वह शांत स्थान बनें, भले ही चारों ओर बवंडर चल रहा हो।

तुम आकाश हो. बाकी सब तो बस मौसम है.

केवल शांत जल में ही चीजें बिना विकृत हुए प्रतिबिंबित होती हैं।

केवल शांत चेतना ही संसार को समझने के लिए उपयुक्त है।

जब आप नहीं जानते कि क्या करना है, तो थोड़ी देर प्रतीक्षा करें। चुप रहना। जैसे रहते हो वैसे जियो. देर-सवेर संकेत दिखाई देगा। मुख्य बात यह जानना है कि आप इंतजार कर रहे हैं और आप जिस चीज का इंतजार कर रहे हैं उसे पूरा करने के लिए तैयार रहें। लुइस रिवेरा

अपने भविष्य के बारे में चिंता न करें, अभी शांति रखें और सब कुछ ठीक हो जाएगा।


शांति आपके शत्रुओं की ताकत छीन लेती है। शांति में न तो भय होता है और न ही अत्यधिक क्रोध - केवल वास्तविकता, विकृतियों और भावनात्मक विस्फोटों के हस्तक्षेप से मुक्त। जब आप शांत होते हैं, तो आप वास्तव में मजबूत होते हैं।

इसलिए, आपके विरोधी आपको इस स्थिति से बाहर निकालने के लिए हमेशा अपनी पूरी ताकत से प्रयास करेंगे - भय पैदा करने के लिए, संदेह पैदा करने के लिए, क्रोध पैदा करने के लिए। आंतरिक स्थिति का सीधा संबंध श्वास से है। आप अपने आप को जिस भी स्थिति में पाएं, तुरंत अपनी सांसें शांत कर लें - इसके बाद आत्मा शांत हो जाएगी।


आध्यात्मिक जीवन में सबसे महत्वपूर्ण बात है हृदय को शांत रखना।

आपको जिंदगी पर भरोसा करना होगा.
बिना किसी डर के खुद को उसकी धारा के हवाले करना जरूरी है, क्योंकि जिंदगी हमसे कहीं ज्यादा समझदार है।
वह अब भी आपके साथ अपने तरीके से व्यवहार करती है, कभी-कभी काफी कठोरता से,
लेकिन अंत में आपको एहसास होगा कि वह सही थी।

अब शांति से रहें और सब कुछ ठीक हो जाएगा।

तेरा मन व्याकुल न हो, तेरे मुंह से कोई बुरा वचन न निकले; तुम्हें प्रेम से भरे हृदय के साथ, गुप्त द्वेष से रहित, परोपकारी बने रहना चाहिए; और यहां तक ​​कि शुभचिंतकों को भी आपको प्रेमपूर्ण विचारों, उदार विचारों, गहरे और असीम, सभी क्रोध और घृणा से मुक्त होकर घेरना चाहिए। इसी प्रकार, मेरे शिष्यों, तुम्हें कार्य करना चाहिए।

केवल शांत जल ही स्वर्ग को सही ढंग से प्रतिबिंबित करता है।

चेतना के स्तर का सबसे अच्छा संकेतक जीवन की कठिनाइयों से शांतिपूर्वक निपटने की क्षमता है।

वे अचेतन व्यक्ति को नीचे की ओर खींचते हैं, जबकि चेतन व्यक्ति अधिकाधिक ऊपर उठता जाता है।

एकहार्ट टॉले.


शांति से बैठें और आप समझ जाएंगे कि रोजमर्रा की चिंताएं कितनी व्यर्थ हैं। थोड़ा चुप रहो और तुम्हें समझ आ जाएगा कि रोजमर्रा के भाषण कितने खोखले होते हैं। रोजमर्रा की परेशानियों को छोड़ दें, और आप समझ जाएंगे कि लोग कितनी ऊर्जा व्यर्थ बर्बाद करते हैं। चेन जिझु.


शांति हमें सबसे कठिन परिस्थितियों से बाहर निकलने का रास्ता खोजने में मदद करती है।

क्या आपका धैर्य ख़त्म हो गया है? ... फिर से फुलाएँ!)

3 शांत सेकंड

सब कुछ समझने के लिए तीन सेकंड तक शांति से सोचना काफी है।

बस यहीं से उन्हें प्राप्त करें, ये सचमुच तीन शांत सेकंड? हम अपनी कल्पनाओं से इतने उत्साहित हैं कि एक पल के लिए भी नहीं रुक सकते।


क्या आपने कभी किसी ओक के पेड़ को तनाव की स्थिति में, या किसी डॉल्फ़िन को उदास मनोदशा में, किसी मेंढक को कम आत्मसम्मान से पीड़ित, किसी बिल्ली को जो आराम नहीं कर सकती, या किसी पक्षी को आक्रोश के बोझ से दबा हुआ देखा है? वर्तमान के साथ तालमेल बिठाने की क्षमता उनसे सीखें।
एकहार्ट टॉले

पर्याप्त समय लो। प्रत्येक कली अपने समय पर खिलती है। कली को फूल बनने के लिए मजबूर मत करो। पंखुड़ियाँ मत मोड़ो. वे सौम्य हैं; तुमने उन्हें चोट पहुंचाई. प्रतीक्षा करें और वे स्वयं खुल जाएंगे। श्री श्री रविशंकर

आसमान में दाढ़ी वाले आदमी या किताब में मूर्ति की पूजा मत करो। साँस लेने और छोड़ने की पूजा करें, आपके चेहरे को सहलाती सर्दी की हवा, मेट्रो में सुबह की भीड़, बस जीवित होने का एहसास, कभी नहीं पता कि क्या होने वाला है।एक अजनबी की आँखों में भगवान को देखें, बर्बाद और सामान्य में प्रोविडेंस को देखें। जिस भूमि पर आप खड़े हों, उसकी पूजा करें। हर दिन को एक नृत्य बनाएं, अपनी आंखों में आंसू लेकर, हर पल में परमात्मा का चिंतन करें, हर सापेक्ष चीज़ में पूर्णता का ध्यान रखें, और लोगों को आपको पागल कहने दें। उन्हें हंसने-मजाक करने दीजिए.

जेफ फोस्टर

उच्च शक्ति दूसरों को हराने की क्षमता नहीं है, बल्कि दूसरों के साथ एक होने की क्षमता है।

श्री चिन्मय

कोशिश करें, कम से कम एक छोटे तरीके से, अपना मन न लाएँ।
दुनिया को देखो - बस देखो.
"पसंद" या "नापसंद" मत कहो। कुछ मत कहो.
शब्द मत कहो, बस देखो।
मन असहज महसूस करेगा।
मेरा मन कुछ कहना चाहता है.
आप बस मन से कहें:
"चुप रहो, मुझे देखने दो, मैं बस देखता रहूँगा"...

चेन जिरू से 6 बुद्धिमान सलाह

1. चुपचाप बैठें और आप समझ जाएंगे कि रोजमर्रा की चिंताएं कितनी व्यर्थ हैं।
2. थोड़ा चुप रहो और तुम्हें समझ आ जाएगा कि रोजमर्रा के भाषण कितने खोखले होते हैं।
3. रोजमर्रा की परेशानियों को छोड़ दें, और आप समझ जाएंगे कि लोग कितनी ऊर्जा व्यर्थ बर्बाद करते हैं।
4. अपने फाटक बन्द कर लो, और तुम जानोगे कि जान-पहचान के बंधन कितने भारी हैं।
5. कुछ इच्छाएँ रखें, और आप समझ जायेंगे कि मानव जाति की बीमारियाँ इतनी अधिक क्यों हैं।
6. अधिक मानवीय बनें, और आप समझ जायेंगे कि सामान्य लोग कितने निष्प्राण होते हैं।

अपने मन को विचारों से मुक्त करें.
अपने दिल को शांत होने दो.
शांति से दुनिया की उथल-पुथल का पालन करें
सब कुछ अपनी जगह पर आते हुए देखें...

एक खुश इंसान को पहचानना बहुत आसान होता है। वह शांति और गर्मजोशी की आभा बिखेरता हुआ प्रतीत होता है, धीरे-धीरे चलता है, लेकिन सब कुछ करने में सफल रहता है, शांति से बोलता है, लेकिन हर कोई उसे समझता है। खुश लोगों का रहस्य सरल है - तनाव का अभाव।

अगर आप हिमालय में कहीं बैठे हैं और सन्नाटा आपको घेरे हुए है तो यह हिमालय का सन्नाटा है, आपका नहीं। आपको अपने भीतर अपना हिमालय खोजना होगा...

सोचा कि घावों को ठीक होने में किसी भी अन्य घाव की तुलना में अधिक समय लगता है।

जेके राउलिंग, "हैरी पॉटर एंड द ऑर्डर ऑफ द फीनिक्स"

बुद्धि शांत रहने की क्षमता से आती है।बस देखो और सुनो. और कुछ नहीं चाहिए. जब आप शांति में होते हैं, जब आप सिर्फ देखते और सुनते हैं, तो यह आपके भीतर आपकी अवधारणा-मुक्त बुद्धि को सक्रिय करता है। शांति को आपके शब्दों और कार्यों का मार्गदर्शन करने दें।

एकहार्ट टॉले "क्या मौन कहता है"

एक व्यक्ति जितना शांत और संतुलित होता है, उसकी क्षमता उतनी ही अधिक शक्तिशाली होती है और अच्छे और योग्य कार्यों में उसकी सफलता उतनी ही अधिक होती है। मन की समता बुद्धि के सबसे बड़े खज़ानों में से एक है।

जेम्स एलन

जब आप स्वयं के साथ सद्भाव में रहते हैं, तो आप दूसरों के साथ घुलने-मिलने में सक्षम होते हैं।

पूर्वी ज्ञान -

तुम बैठो - और खुद बैठो; तुम जाओ - और स्वयं जाओ।
मुख्य बात - व्यर्थ उपद्रव मत करो.

जो चीजें आपको परेशान करती हैं, उनके प्रति अपना नजरिया बदलें और आप उनसे सुरक्षित रहेंगे। (मार्कस ऑरेलियस)

अपना ध्यान सौर जाल पर लाएँ। यह कल्पना करने का प्रयास करें कि एक छोटा सा सौर गेंद आपके भीतर जल रहा है। इसे भड़कने दो, बड़ा और मजबूत होने दो। इसकी किरणों को तुम्हें रोशन करने दो। सूर्य को अपनी किरणों से अपने पूरे शरीर को संतृप्त करने दें।

समरसता हर चीज़ में समरूपता है। यदि आप उपद्रव करना चाहते हैं, तो 10 तक गिनें और सूर्य को "शुरू" करें।

शांत, बिल्कुल शांत :)

आपके अंदर क्या हो रहा है, उसमें रुचि रखें, जो आपके चारों ओर है उससे कम नहीं। यदि आंतरिक संसार में सब कुछ व्यवस्थित है, तो बाहरी संसार में भी सब कुछ व्यवस्थित हो जाएगा।

एकहार्ट टॉले ---

मूर्ख और अज्ञानी के पांच लक्षण होते हैं:
बिना किसी कारण के क्रोधित होना
अनावश्यक बोलना
बिना किसी कारण के परिवर्तन
उन चीज़ों में हस्तक्षेप करें जिनसे उनका बिल्कुल भी सरोकार नहीं है,
और यह नहीं जानते कि यह कैसे भेद किया जाए कि कौन उनका भला चाहता है और कौन बुरा।

भारतीय कहावत ---

जो जाता है, जाने दो।
जो आता है, आने दो।
तुम्हारे पास अपने अलावा कुछ भी नहीं है और कभी था भी नहीं।

यदि आप यादों और अपेक्षाओं से अपवित्र आंतरिक मौन रख सकें, तो आप घटनाओं का एक सुंदर पैटर्न देख सकते हैं। यह आपकी चिंता ही है जो अराजकता पैदा करती है।

निसर्गदत्त महाराज ---

ख़ुशी का केवल एक ही रास्ता है और वह है उन चीज़ों के बारे में चिंता करना बंद कर देना जो हमारी इच्छा से परे हैं।

एपिक्टेटस ---

जब हम अपने आत्म-महत्व की भावना खो देते हैं, तो हम अजेय हो जाते हैं।

मजबूत होने के लिए आपको पानी की तरह बनना होगा। कोई बाधा नहीं है - वह बहती है; बांध - यह रुक जाएगा; बाँध टूटेगा - फिर बहेगा; चतुष्कोणीय बर्तन में यह चतुष्कोणीय होता है; गोल में - यह गोल है. क्योंकि यह इतना आज्ञाकारी है, यह सबसे अधिक आवश्यक और सबसे मजबूत है।

दुनिया एक रेलवे स्टेशन की तरह है, जहां हम हमेशा इंतजार करते रहते हैं, फिर जल्दी में।

जब आपका मन और इंद्रियाँ हृदय की धड़कन की गति तक धीमी हो जाती हैं, तो आप अनायास ही ब्रह्मांडीय लय के साथ सामंजस्य स्थापित कर लेते हैं। आप दुनिया को दिव्य आंखों से देखना शुरू करते हैं, यह देखते हुए कि कैसे सब कुछ अपने आप और अपने समय पर होता है। यह पाते हुए कि सब कुछ पहले से ही ब्रह्मांड के नियम के अनुरूप है, आपको समझ में आता है कि आप दुनिया और उसके भगवान से अलग नहीं हैं। यह आज़ादी है. मूओजी

हमें बहुत कष्ट सहना पड़ता है. हम इसे बहुत गंभीरता से लेते हैं. सब कुछ आसान होना चाहिए. लेकिन समझदारी से. कोई घबराहट नहीं. मुख्य बात है सोचना। और बेवकूफी भरी बातें मत करो.

जिसे आप शांति से ले सकते हैं वह अब आपको नियंत्रित नहीं करता...

उन लोगों के लिए कहीं भी शांति नहीं मिल सकती जिन्होंने इसे स्वयं में नहीं पाया है।

क्रोधित और नाराज़ होना दूसरे लोगों की मूर्खता के लिए स्वयं को दंडित करने के अलावा और कुछ नहीं है।

तुम आकाश हो. और बादल तो होते ही रहते हैं, आते हैं और चले जाते हैं।

एकहार्ट टॉले

शांति से जीना। वसंत आता है, और फूल अपने आप खिल जाते हैं।


यह ज्ञात है कि एक व्यक्ति जितना शांत दिखता है, उतना ही कम अन्य लोग उसका खंडन करते हैं और उससे बहस करते हैं। इसके विपरीत, यदि कोई व्यक्ति अपनी बात का जोरदार ढंग से बचाव करता है, तो उसके साथ बहस की जाती है और उसका हिंसक विरोध किया जाता है।

जल्दी नहीं है। भोजन के समय खाओ, और यात्रा का समय आ जाएगा- यात्रा शुरू कर नजरों से दूर जाना।

पाउलो कोएल्हो "द अलकेमिस्ट"

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

एकहार्ट टोल न्यू अर्थ

"शांत हो जाओ" संदेश हमेशा किसी न किसी कारण से अधिक परेशान करना।एक और विरोधाभास.आमतौर पर ऐसी कॉल के बादकोई शांत होने के बारे में नहीं सोचता.

बर्नार्ड वर्बर कैसेंड्रा का दर्पण

जिसने स्वयं को नम्र किया, उसने शत्रुओं को परास्त किया।

एथोस का सिलौआन

शांत वह है जो ईश्वर को अपने में रखता है।


जब आप किसी मूर्ख से बहस करते हैं, तो संभवतः वह भी वही कर रहा होता है।

किसी व्यक्ति की असली ताकत आवेगों में नहीं, बल्कि अविनाशी शांति में है।

मानव ज्ञान की उच्चतम डिग्री परिस्थितियों के अनुकूल ढलने और बाहरी तूफानों के बावजूद शांत रहने की क्षमता है।

यदि आप उन पर ध्यान नहीं देंगे तो हस्तक्षेप करने वाली भावनाएँ और विचार गायब हो जायेंगे। लामा ओले निदाल

आपको कभी इस बात का पछतावा नहीं होगा कि आप किस बारे में चुप रहने में कामयाब रहे।
--- पूर्वी ज्ञान ---

यह चेतना की ऐसी स्थिति के लिए प्रयास करने लायक है जिसमें सभी घटनाओं को तटस्थ रूप से माना जाएगा।

शांति और व्यवस्था, मन की सामान्य शांति - ये प्रत्येक व्यक्ति की वांछित अवस्थाएँ हैं। हमारा जीवन मूल रूप से एक झूले की तरह गुजरता है - नकारात्मक भावनाओं से उत्साह तक, और इसके विपरीत।

संतुलन का एक बिंदु कैसे खोजें और बनाए रखें ताकि दुनिया को सकारात्मक और शांति से देखा जाए, कुछ भी परेशान या डराता नहीं है, और वर्तमान क्षण प्रेरणा और खुशी लाता है? और क्या दीर्घकालिक मानसिक शांति पाना संभव है? जी हां संभव है! इसके अलावा, शांति के साथ-साथ सच्ची स्वतंत्रता और जीने की सरल खुशी भी मिलती है।

ये सरल नियम हैं, और ये धार्मिक रूप से काम करते हैं। आपको बस यह सोचना बंद करना होगा कि कैसे बदलाव करें और उन्हें लागू करना शुरू करें।

1. यह पूछना बंद करें कि "मेरे साथ ऐसा क्यों हुआ?" अपने आप से एक और प्रश्न पूछें: “कौन सी अद्भुत बात हुई? इससे मेरा क्या भला हो सकता है?” अच्छाई वहाँ है, आपको बस उसे देखना है। कोई भी समस्या ऊपर से एक वास्तविक उपहार में बदल सकती है, यदि आप इसे एक अवसर मानते हैं, न कि सज़ा या अन्याय।

2. कृतज्ञता का अभ्यास करें. हर शाम का सारांश: उस दिन के लिए आप "धन्यवाद" कह सकते हैं जो आपने जीया था। यदि मन की शांति खो गई है, तो उन अच्छी चीजों को याद रखें जो आपके पास हैं और जिन चीजों के लिए आप जीवन में आभारी हो सकते हैं।

3. शरीर को शारीरिक व्यायाम से भर दें। याद रखें कि शारीरिक प्रशिक्षण के दौरान मस्तिष्क सबसे अधिक सक्रिय रूप से "खुशी के हार्मोन" (एंडोर्फिन और एन्केफेलिन्स) का उत्पादन करता है। इसलिए, यदि आप समस्याओं, चिंता, अनिद्रा से परेशान हैं - तो बाहर जाएँ और कई घंटों तक टहलें। एक तेज़ कदम या दौड़ उदास विचारों से ध्यान भटकाएगी, मस्तिष्क को ऑक्सीजन से संतृप्त करेगी और सकारात्मक हार्मोन के स्तर को बढ़ाएगी।

4. एक "हंसमुख मुद्रा" विकसित करें और अपने लिए एक प्रसन्न मुद्रा बनाएं। जब आपको मानसिक शांति बहाल करने की आवश्यकता हो तो शरीर आश्चर्यजनक रूप से मदद कर सकता है। यदि आप बस अपनी पीठ सीधी कर लें, अपने कंधे सीधे कर लें, ख़ुशी से आगे बढ़ें और मुस्कुराएँ तो यह आनंद की अनुभूति को "याद" रखेगा। थोड़ी देर के लिए सचेतन रूप से अपने आप को इस स्थिति में रखें और आप देखेंगे कि आपके दिमाग में विचार शांत, अधिक आत्मविश्वासी और खुश हो गए हैं।

5. अपने आप को यहीं और अभी वापस लाओ। एक सरल व्यायाम चिंता से छुटकारा पाने में मदद करता है: चारों ओर देखें, जो आप देखते हैं उस पर ध्यान केंद्रित करें। चित्र को मानसिक रूप से "आवाज़ देना" शुरू करें, "अभी" और "यहाँ" जितना संभव हो उतने शब्द डालें। उदाहरण के लिए: “मैं अभी सड़क पर चल रहा हूँ, यहाँ सूरज चमक रहा है। अब मैं एक आदमी को देखता हूं, वह पीले फूल लिए हुए है…” इत्यादि। जीवन में केवल "अभी" क्षण शामिल हैं, इसे मत भूलो।

6. अपनी समस्याओं को बढ़ा-चढ़ाकर न बताएं. आख़िरकार, यदि आप एक मक्खी को अपनी आँखों के पास भी लाएँ, तो वह एक हाथी के आकार का हो जाएगी! यदि कोई अनुभव आपके लिए दुर्गम लगता है, तो सोचें जैसे कि दस साल पहले ही बीत चुके हैं... पहले कितनी समस्याएं थीं - आपने उन सभी को हल कर दिया। इसलिए ये मुसीबत भी टल जाएगी, इसमें दिमाग मत लगाओ!

7. अधिक हंसें. वर्तमान स्थिति में कुछ मज़ेदार खोजने का प्रयास करें। यह काम नहीं करता - तो बस ईमानदारी से हँसने का कारण खोजें। कोई मज़ेदार फ़िल्म देखें, कोई मज़ेदार घटना याद रखें। हँसी की शक्ति अद्भुत है! हास्य की अच्छी खुराक के बाद मन की शांति अक्सर लौट आती है।

8. अधिक क्षमा करें. नाराजगी भारी, बदबूदार पत्थरों की तरह होती है जिन्हें आप अपने साथ लेकर घूमते हैं। इतने बोझ के साथ मन को क्या शांति मिल सकती है? इसलिए बुरा मत मानना. लोग सिर्फ लोग हैं, वे पूर्ण नहीं हो सकते और हमेशा अच्छाई ही लाते हैं। इसलिए अपराधियों को क्षमा करें और स्वयं को क्षमा करें।

10. अधिक संवाद करें. अंदर छिपा कोई भी दर्द कई गुना बढ़ जाता है और नए दुखद फल लेकर आता है। इसलिए, अपने अनुभव साझा करें, प्रियजनों के साथ उन पर चर्चा करें, उनका समर्थन खोजें। याद रखें कि मनुष्य अकेले रहने के लिए नहीं बना है। मन की शांति केवल करीबी रिश्तों - दोस्ती, प्यार, परिवार में ही पाई जा सकती है।

11. प्रार्थना करें और ध्यान करें. बुरे बुरे विचारों को अपने ऊपर हावी न होने दें, घबराहट, दर्द और चिड़चिड़ापन न बोएं। उन्हें छोटी प्रार्थनाओं में बदलें - ईश्वर से अपील या ध्यान - बिना सोचे-समझे की स्थिति। आंतरिक बातचीत के अनियंत्रित प्रवाह को रोकें। यही एक अच्छी एवं स्थिर मनःस्थिति का आधार है।