علم النفس القصص تعليم

النظام والهدوء. الهدوء

عندما يبدو أن المستوى التالي قد تم تجاوزه ، فإن الظلال ستزحف بالتأكيد وتتحقق مما إذا كان يتم الحفاظ على التوازن ووجود العقل أثناء رقصاتهم.

إن ردة الفعل على الظل تتأرجح في بندول الأنا وتكشف الحقيقة القاسية: التوازن متوتر مثل تحذير ماشي على حبل مشدود وهو على وشك إلقاء الرجل الشجاع في هاوية الماضي.

التوازن الحقيقي هو غياب الملاحظة المتحيزة: البحث عما يجري هنا ليس صحيحًا.

يقول المتأمل الداخلي: "كل شيء كالمعتاد" ، حتى لو كان هناك وباء أو تهديدات تتدفق ، "كل ما في الأمر أن هؤلاء الأشخاص مصابين ويحتاجون إلى أن يكونوا على دراية بمسارهم.

ولكن إذا كانت هناك ردود أفعال أخرى ، فهذا يعني أن المسار لم يكتمل ولم يأت استكمال المرحلة بعد.

- لماذا أحتاج هذا؟ - أنت فقط في بداية رحلتك عبر المستوى.
أنا مستعد للقتال حتى الموت! أنت ربع الطريق.
أنا أحب هذا النوع من المغامرة! - تم تجاوز نصف الطريق بالفعل.
- تعال إلي ، سأنقذك - لقد قطعت ثلاثة أرباع الطريق.
- كم أنا ممتن لك لأنك بالضبط هكذا! - 2/10 الطريق الى نهاية المستوى.
- وايفارير ، إلى أين تتجه وماذا تريد أن تحقق بعدوانك؟ - لقد اجتزت هذا المستوى وأخذت في اختبار الظل الخطير.

هناك الكثير من الحب والكثير من الفن في الظل. بصفتها معلمة جيدة ، تلعب دور Tyrant و Victim و Rescuer بشكل مثالي لاختبار توازنك. بعد كل شيء ، بلغة اللاعبين: التوازن هو مستوى الله.

© مارك إفرايموف

********

قواعد السلام

احصل على استعداد لترك.

الأشخاص الذين يخدعونك ، يتلاعبون بك ، يلومونك ، يشكون ، غير سعداء ، يدفعونك إلى الجنون ، يحرمونك من السلام العاطفي.

يكون مساويا.

تلك المساواة التي يكون فيها كل فرد مسئول عن حياته ، ولا ينتظر من يسعدهم أو يخبرهم كيف يعيشون.

كن حذرا.

لا تستسلم للشكاوى والتلاعب. العلاقات هي الوجود في حياة الآخر وليس خلاصه. لا يجب الخلط بينه وبين طلب مباشر للمساعدة. اسأل - ساعدك قدر الإمكان.

استعد للمغادرة.

لا تتورط في التفكيك والاتهامات. لا تختلق الأعذار. إذا كنت مخطئا ، اعتذر. هذا يكفى. إذا تسببت في ضرر كبير لمشاعر شخص ما ، اسأل ما الذي يمكن فعله للتعويض؟ إذا لم تكن هناك استجابة ، فاستعد للابتعاد. هذا ليس عن ذنبك ، ولكن حول اتهاماته.

كن حازما.

"أنت ممدوح - لا تفرح. إنهم يوبخون - لا تنزعجوا "(ج). لا يمكنك الفوز أو الخسارة طوال الوقت. لا يمكنك حتى تقسيم كل شيء إلى خسارة ومكاسب. اكتشف ما تعلمته وما اكتشفته في نفسك بفضل هذا الحدث. انطلق في طريقك بخطوة حازمة.

يمر.

مر على صراعات الآخرين ، القيل والقال ، الفئوية ، التقييم ، الغضب ، الانتقام ، الأنين ، التسميات ، الحسد. لا تتورط في كل هذا ، لا تدعم ، لا تضيع وقتك ... هيا ...

استعد للمغادرة.

نستمر في التعرف على الابتكارات اللغوية لمعيار C ++ 17. في هذه المقالة ، سننظر في ما يمكن أن أسميه استمرارًا لتعريف اللغة. أولئك. لن نرى أي أشياء جديدة تمامًا ، من وجهة نظر الوظائف ، أشياء هنا - بدلاً من ذلك ، جلب الوظائف القديمة إلى حالة أكثر قبولًا. هنا سنلقي نظرة على ما تغير بترتيب تنفيذ التعبيرات الفرعية ، وما هي الضمانات الجديدة التي ظهرت فيما يتعلق باستبعاد النسخ الاختياري ، وكذلك ما تمت إضافته إلى lambdas.

ترتيب الأمور

واجه العديد من مبرمجي لغة ++ C مشاكل "مثيرة للاهتمام" حيث تم تقديم بعض التعليمات البرمجية المثيرة للجدل والسؤال هو: "ما الذي سيتم إنتاجه؟" أحد الأمثلة الشائعة على هذا الرمز هو المثال التالي:

كثافة العمليات أنا = 0 ؛ أنا = i ++ + i ++ ؛

تم العثور على هذا الرمز "الذكي" على الشبكة وفي المقابلات. الغرض من هذه الأسئلة هو معرفة مدى معرفة المجيب بخصائص ترتيب تنفيذ التعبيرات في C ++.

على الأقل هذا هو الهدف المعلن. صحيح ، أعتقد أنه في معظم الحالات ، الشخص الذي يطرح مثل هذه الأسئلة يريد فقط تسلية غروره. إن معرفة ما سينتج عن هذا الكود هو أمر اختياري تمامًا ، لأنه ببساطة لا يمكن كتابة هذا الرمز. وبما أنك لا تستطيع الكتابة ، فلماذا تسأل مقدم الطلب عن هذا؟ مثل هذه الأسئلة مناسبة لـ "غرف التدخين" حيث يناقش زملاؤنا المبرمجون الحالات الحرجة ؛ هم غير مناسبين للمقابلات. أوصي بقراءة أفكار ريموند تشين حول هذا الموضوع: "هل يكتب الناس شيفرة مجنونة ذات آثار جانبية متداخلة متعددة بوجه مستقيم؟"

لكن هذه حالة مرضية يمكن رؤيتها بالعين المجردة ، وكما ذكرت سابقًا ، لن يكتب المبرمج العادي هكذا أبدًا. لكن هناك حالات أقل وضوحًا يمكن حتى للمبرمجين ذوي الخبرة كتابتها. لنلقِ نظرة على هذا الجزء من الكود:

باطل f2 () (std :: string s = "لكنني سمعت أنه يعمل حتى إذا كنت" لا تؤمن به "؛ s.replace (0، 4،" ") .replace (s.find (" even " )، 4، "only") .replace (s.find ("don" t ")، 6،" ") ؛ أكد (s ==" لقد سمعت أنه يعمل فقط إذا كنت تؤمن به ") ؛)

تم تقديم هذا الرمز في أحدث كتاب لـ Stroustrup ، الإصدار الرابع من لغة البرمجة C ++ ، في القسم 36.3.6 ، ويبدو للوهلة الأولى أنه قابل للاستخدام وصحيح تمامًا. لكن هذا فقط للوهلة الأولى ، في الواقع لا توجد ضمانات بأن الكود أعلاه سيشكل السلسلة المتوقعة ، وبالتالي ، لن يعمل التوكيد.

كما نرى ، حتى منشئ C ++ ارتكب خطأ في مثل هذا الجزء الصغير من التعليمات البرمجية. ماذا يقول؟ بادئ ذي بدء ، لست بحاجة إلى حشر مجموعة من التعليمات البرمجية في تعبير واحد يحدث فيه الكثير من الأشياء المختلفة. النسخة الأولى من هذا الكود ، والتي يتم تقديمها في نفس الصفحة من الكتاب ، هي أبسط وأفضل بكثير:

Void f () (std :: string s = "لكنني سمعت أنه يعمل حتى إذا كنت" لا تؤمن به "؛ s.replace (0 ، 4 ،" ") ؛ s.replace (s.find (" even ")، 4،" only ")؛ s.replace (s.find (" don "t")، 6، "")؛ أكد (s == "لقد سمعت أنه يعمل فقط إذا كنت تؤمن به" ) ؛)

هذا الخيار ليس صحيحًا فقط من وجهة نظر تنفيذ البرنامج ، بل يسهل قراءته أيضًا. لكن هذا ليس الاستنتاج الوحيد الذي يجب أن نستخلصه ، فهناك واحد آخر قدمه لنا بالفعل مؤلفو الاقتراح P0145R3: هناك خطأ ما في ترتيب تنفيذ التعبيرات الفرعية في C ++.

طلب قديم

قبل أن ننتقل إلى الاقتراح نفسه والتغييرات التي أدت إلى اعتماده ، أقترح التذكير بالقواعد الحالية. سيساعد هذا في التحديث (ومساعدة شخص ما على معرفة) سبب كون المثالين المذكورين أعلاه عبارة عن كود C ++ سيئ (فقط من حيث اللغة ، وليس الجماليات). لذلك ، على عكس العديد من لغات البرمجة الأخرى ، في C ++ ، لا يتم تحديد ترتيب تنفيذ التعبيرات الفرعية في التعبيرات من خلال المعيار ويتم تركه للمترجم. بالطبع ، لا يزال هناك ترتيب معين ، لكنني لن أصف كل التفاصيل الدقيقة هنا ، لأن. هناك ما يكفي منهم. من المهم أن نفهم أنه ، كقاعدة عامة ، يتم تنفيذ تعبيرين فرعيين لتعبير كبير بشكل مستقل عن بعضهما البعض في غير محددالترتيب (الاستثناء الكبير لهذه القاعدة هو عامل التشغيل "،" الفاصلة).

على سبيل المثال ، لنأخذ مثالنا الأول: 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 ++ ، لأن التعبير الأول له آثار جانبية (تزداد أنا بواحد) قبل أن يتم تقييمه.

على الرغم من أن الخيار الثاني أكثر وضوحًا ، إلا أن كلاهما يعطي ما يسمى سلوك غير محدد(NP ، اللغة الإنجليزية سلوك غير محدد). جميع مبرمجي C ++ المخضرمين على دراية بهذا المصطلح ، لكن نادرًا ما يعرف الكثير من الناس جميع الأماكن في لغة C ++ حيث يمكن أن يحدث هذا السلوك. هذا موضوع واسع ومثير للاهتمام إلى حد ما ، ويمكن تغطيته في أكثر من مقال ، لذلك لن أتطرق إلى هذا بمزيد من التفصيل. في الواقع ، لم تكن هناك حاجة إلى مثل هذا التحليل التفصيلي للتعبير ، لأن وفقًا للمعيار (intro.execution / p15) فإن تعبيرنا هو NP بالفعل لأنه في تعبير واحد يوجد تعبيران فرعيان يقومان بتعديل نفس الكائن القياسي ، ولم يتم تحديد ترتيب التغييرات. لماذا إذن أعطيت هذا التحليل؟ حاولت أن أوضح لماذا يتجلى NP بناءً على القيود الحالية على تنفيذ التعبيرات ، أي كان الهدف هو إظهار أنه مع القواعد الحالية ، ليس للمعيار خيار آخر سوى تجاهلها.

الآن دعنا ننتقل إلى المثال الثاني ونكتشف ما هو الخطأ فيه. لتسهيل الفهم ، سأختصر هذا المثال بهذا التعبير: s.replace (s.find ("even")، 4، "only"). ماذا لدينا هنا؟ هناك كائن s ، هناك استدعاء لوظيفة العضو std :: string :: replace ، دالة أخرى std :: string :: find ، ووسائط لهذه الوظائف. ما هي الضمانات التي يقدمها لنا المعيار؟ يضمن المعيار أن يتم تقييم وسيطات الوظيفة قبل استدعاء الوظيفة. كما أنه يضمن أن الكائن الذي يتم تنفيذ الوظيفة عليه يجب أن يتم تقييمه قبل استدعاء الوظيفة عليه. كل هذا واضح ومنطقي. صحيح ، ليس لدينا ضمانات أخرى: ليس هناك ما يضمن أن s سيتم تقييمها قبل أن يتم تقييم الحجج الخاصة بوظيفة الاستبدال ، ولا توجد أيضًا ضمانات فيما يتعلق بالترتيب الذي يتم به تقييم هذه الوسيطات. لذلك ، يمكننا الحصول على أمر التقييم هذا: s.find ("even") ، "only" ، 4 ، s ، s.replace (...). أو أي شيء آخر لا ينتهك الضمانات المحددة مسبقًا للمعيار.

من النص أعلاه ، يجب التمييز بين نقطتين رئيسيتين: 1) يمكن تقييم التعبيرات على يسار ويمين النقطة بأي ترتيب ، 2) يمكن تقييم وسيطات الوظيفة بأي ترتيب. بناءً على ذلك ، يجب أن يكون واضحًا الآن سبب عدم صحة الشفرة من كتاب Stroustrup. في تعبير:

S.replace (0، 4، "") .replace (s.find ("even")، 4، "only") .replace (s.find ("don" t ")، 6،" ")؛

قد تنتهي كلتا الاستدعاءات المراد العثور عليها قبل اكتمال الاستبدالات السابقة (في الكود). وربما بعد ذلك. حتى الأول يمكن من قبل ، والثاني في وقت لاحق - غير معروف ، لأن لم يتم تعريف الطلب. نتيجة لذلك ، يعطي هذا الرمز نتيجة غير متوقعة ، على الرغم من أنها ليست كذلك NP. ومع ذلك ، كما قلت ، لن يكتب المبرمج المختص مثل هذا الرمز ، وحقيقة أنه موجود في كتاب Stroustrup لا يعني أنه سيكتب بهذه الطريقة - لقد أعطى مثالاً لسلسلة المكالمات.

بالإضافة إلى ذلك ، قد لا تكون سلسلة الاستدعاء واضحة جدًا. على سبيل المثال ، هذا هو الرمز:

الأمراض المنقولة جنسيا :: cout<< first << second;

هذه أيضًا سلسلة من المكالمات ، والتي يمكن أن تكون على النحو التالي:

الأمراض المنقولة جنسيا :: cout.operator<<(first).operator<<(second);

او مثل هذا:

المشغل أو العامل<<(operator<<(std::cout, first), second);

الاختلاف ليس أساسيا. إذا كانت التعابير الأولى والثانية تشير فجأة إلى نفس الكائن ، وقام أحد هذه التعبيرات بتعديل هذا الكائن ، فهناك احتمال كبير بأن نحصل على رمز غير مستقر عند الإخراج ، أو NP.

مثال آخر مثير للاهتمام من الجملة أعلاه:

الأمراض المنقولة جنسيا :: الخريطة قاموس؛ القاموس = Dictionary.size () ؛

نعم ، تبدو الشفرة بلا معنى ، ولكن ماذا ستعطي نتيجة لذلك؟ حتى الشفرة التي لا معنى لها يجب أن تنتج نتائج يمكن التنبؤ بها. لسوء الحظ ، فإن C ++ على غرار 2014 تتجاهل أكتافها فقط - لا أعرف ، كما يقولون.

الوظائف والمشغلين

عندما نظرنا إلى سلسلة الاتصال ، تطرقنا إلى نقطة أخرى مثيرة للاهتمام: ما الذي يتحول إليه استدعاء std :: cout في الواقع<< first << second; . Как мы уже видели, в зависимости от того, чем являются first и second , мы можем получить либо цепочку вызовов функций-членов, либо же вложенные вызовы свободных функций. Но ведь в изначальном варианте записи у нас есть три выражения и 2 оператора << , у нас нет вообще никаких функций!

من غير المحتمل أن يتسبب هذا الرمز في حدوث مشكلات لمبرمجي C ++: عاجلاً أم آجلاً ، نتعلم جميعًا عن التحميل الزائد للمشغل ونأخذ كل ذلك كأمر مسلم به ، ولكن هناك فارق بسيط واحد في هذا التحميل الزائد. لإظهار هذا الفارق البسيط ، دعنا نكتب قالب الوظيفة التالي:

نموذج << "first\n", value++) && (cout << "second\n", value++); }

نعم ، القالب ليس هو الأكثر إفادة وتميزًا ، لكنه ، كما سنرى الآن ، هو دلالة للغاية. دعنا نطلق على دالة cleverFun مع وسيطة int ، والتي ستنشئ هذه الوظيفة:

Bool cleverFun (int & value) (return (cout<< "first\n", value++) && (cout << "second\n", value++); }

عندما يتم استدعاء هذه الوظيفة ، يتم ضمان أن يكون الإخراج:

إذا كانت القيمة الأولى ++ سترجع 0 ، وإلا فسيكون مثل هذا:

الثانية الأولى

وليس غيرها ، وهو أمر واضح: هناك ضمان قوي للمشغل && دائرة مقصورة(KZ ، ماس كهربائى إنجليزي) وتنفيذ الجانب الأيسر إلى اليمين. من ناحية أخرى ، إذا أنشأنا نوعًا من النوع Int نعيد تعريف كل من عامل postfix ++ والمشغل && ، ثم أنشأنا نموذجنا به ، فسنحصل على الوظيفة التالية:

Int cleverFun (Int & value) (إرجاع (cout<< "first\n", value.operator++(0)) .operator&&((cout << "second\n", value.operator++(0))); }

لم أبدأ في الكشف عن ما ستتحول إليه مكالمة cout ، حتى لا تتناثر بالفعل ليس من السهل جدًا قراءة الكود أكثر. بناءً على ما رأيته حتى الآن ، لا ينبغي أن يفاجئك أن الإخراج من هذا الرمز سيكون مختلفًا عما تحصل عليه من أجل int العادي. هنا يمكنك أيضًا الحصول على خيارين ، لكنهما سيكونان مختلفين:

الثانية الأولى

الثانية أولا

من الواضح أنه لا يمكننا الحصول على الخيار مع خيار واحد أولاً نظرًا لحقيقة أن ماس كهربائى للمشغلين المعاد تعريفهم لا يعمل. إذا نظرت عن كثب إلى هذا المثال ، يجب أن تفهم السبب: من أجل تنفيذ عامل تشغيل تم تجاوزه && ، يجب تقييم وسيطة له (أي وداعًا لدائرة كهربائية قصيرة) ، بالإضافة إلى ذلك ، لا تعمل الدائرة القصيرة إلا عندما يكون التعبير الموجود على اليسار هو منطقي ، والذي في حالة تجاوزه لا يمكن أن يكون هناك عامل. وبالتالي ، لا يمكن أن تكون هناك أوهام حول ماس كهربائى - فهو غير موجود للمشغلين المعاد تعريفهم ولن يحدث أبدًا.

حسنًا ، لا يمكن أن يكون هناك ماس كهربائي ، لذلك لا يمكننا الحصول على خيار الإخراج الأول (الأول فقط) ، ولكن حتى الخيار الذي يحتوي على سطرين من الإخراج قد يكون مختلفًا وقد لا يكون مختلفًا! فقط فكر في الأمر: لدينا نفس الكود داخل قالب الوظيفة ، والذي ، مع بعض وسيطات القالب ، يتم تنفيذه وفقًا لقواعد واحدة ، ولأخرى ، وفقًا لقواعد مختلفة تمامًا.

هذا كله لأنه ، في C ++ 14 ، تختلف ضمانات المشغلين ومعاملاتهم اعتمادًا على ماهية المعاملات. وفقًا للمعيار ، بالنسبة للأنواع المتكاملة ، يضمن جميع المشغلين العمل كما هو موصوف لهم في المعيار ، ولكن بالنسبة للمشغلين الذين تم تجاوزهم ، تعمل القواعد التي تتحكم في استدعاءات الوظائف بالفعل. أولئك. بالنسبة للمشغلين المتجاوزين ، يتم "إعادة كتابة" التعبير بواسطة المترجم إلى سلسلة استدعاء الوظيفة ، وبعد ذلك ، يتم تطبيق القواعد من المعيار المحدد لمثل هذه السلسلة. لا تنطبق أي من ضمانات المشغل من المعيار على المشغلين المتجاوزين..

كل ما تم وصفه سابقًا يرسم صورة قاتمة للغاية: هناك الكثير من الفوضى في C ++ ، فيما يتعلق بتقييم التعبيرات. لا عجب أن الناس قد سئموا من تحمل مثل هذه الأشياء ، وأن العبارات الأبدية بأن كل هذا ضروري لنوع من التحسينات الأسطورية ولا ينبغي تغييرها لم تعد تعتبر مبررًا كافيًا. ساد الفطرة السليمة ، وتلقت C ++ 17 بعض التغييرات لتنظيف هذه الفوضى. وما نوع التغييرات التي نمر بها الآن وننظر فيها.

طلب جديد

التغيير الأول الذي جلبته C ++ 17 هو الترتيب تحقيق، إنجازعوامل ما بعد الإصلاح وعوامل التخصيص وعوامل النقل على مستوى البت. يتم الآن تنفيذ جميع عوامل التشغيل اللاحقة للإصلاح ، بالإضافة إلى عوامل النقل على مستوى البت ، من اليسار إلى اليمين ، بينما يتم تنفيذ عوامل التخصيص بالعكس ، من اليمين إلى اليسار. بكلمة "التنفيذ" ، في هذا السياق ، أعني أن التعبير قد تم تقييمه (أي يتم إرجاع نتيجته) ، ويتم الالتزام بجميع الآثار الجانبية المرتبطة به.

لشرح كيفية ترتيب التعبيرات الآن ، دعنا نأخذ مثالاً من الجملة (في المثال أدناه ، يتم تنفيذ التعبير a أولاً ، ثم b):

أ ب أ-> ب أ -> * ب أ (ب 1 ، ب 2 ، ب 3) ب @ = أ أ [ب] أ<< b a >> ب

حيث @ هو أي عامل صالح في هذا السياق (على سبيل المثال +). وبالتالي ، بناءً على القواعد الجديدة ، فإن المثال الوارد في كتاب Stroustrup على C ++ 11 يصبح أخيرًا صحيحًا في C ++ 17 وسيؤدي دائمًا إلى النتيجة الصحيحة والمتوقعة. كما ترى ، لا تؤثر القواعد الجديدة على ترتيب تنفيذ وسيطات الوظيفة بالنسبة لبعضها البعض: لا يزال من الممكن تنفيذها بأي ترتيب ، لكن تنفيذها لا يمكن أن يتداخل مع بعضها البعض. بمعنى آخر ، يتم ترتيبها بالنسبة لبعضها البعض ، لكن الترتيب غير منظم.

الآن دعونا نلقي نظرة على بعض الأمثلة "المثيرة للاهتمام" حيث لدينا في C ++ 14 NP ، ولكن في C ++ 17 ذهب. أعطي هذه الأمثلة فقط من أجل استهلاكي الشخصي ، وأحثكم على عدم تعذيب الناس معهم في المقابلات.

أنا = أنا ++ ؛ صفيف f (++ i، ++ i) f (i ++، i ++) = i ++ i<< i++ cout << i++ << i++

لكن هذه الأمثلة باقية NP في المعيار الجديد:

أنا = i ++ + i ++ i = ++ i * i ++

لأنه لم تتم إضافة أي قواعد لتنظيم الترتيب الذي يتم به تنفيذ التعبيرات الفرعية للعمليات الحسابية. لكن حقيقة ذلك اختفاء NP من هذه الأمثلة لا يعني على الإطلاق أن الوقت قد حان لإشباع التعليمات البرمجية الخاصة بك بأخرى مماثلة - لا. يتطلب كل من هذه الأمثلة اهتمامًا دقيقًا وإثباتًا على أنها ليست كذلك NP. أولئك. أي مبرمج يرى رمزًا مثل هذا سيضطر إلى التوقف والتذكر (أو الصعود إلى المعيار) والتأكد من أنه يرى الكود الصحيح أمامه. يجب ألا تكون الشفرة "ذكية" ، يجب أن تكون الشفرة مفهومة.علاوة على ذلك ، فإن مثل هذا المزيج من التعبيرات يعطي القليل ، في الواقع.

بالمناسبة ، يجب أن يكون القارئ اليقظ قد لاحظ خط cout<< i++ << i++ в вышеприведённых примерах, и если он не знает обо всех правилах и поверил автору, то он наверняка воспользовался такой логикой: пример переписывается как

مشغل<<(i++).operator<<(i++)

بعد ذلك القواعد الجديدة ل. لذلك لا يحتوي الرمز NP. يبدو هذا التفكير منطقيًا ، لكنه ليس صحيحًا تمامًا. في الواقع ، كل شيء أبسط: لقد تمت إعادة كتابة المثال بالفعل بواسطة المترجم إلى الذي قدمته ، لكن أمر التنفيذ يتم إنشاؤه قبل إعادة الكتابة! أولئك. وفقًا للقواعد الجديدة يطيع المشغلون المثقلون بقواعد التنفيذ للمشغلين المدمجين، على الأقل من حيث الترتيب الذي يتم به تقييم التعبيرات الفرعية. لذلك ، بناءً على حقيقة أن المعامل الأيسر للمشغل<< вычисляется до правого у нас и нет NP في الكود.

اتضح أنه لم يعد لدينا تناقض في الترتيب الذي سيتم به تنفيذ التعبيرات الخاصة بالمشغلين المدمجين والمحملين فوق طاقتنا ، ومثالنا من القسم السابق:

نموذج bool cleverFun (T & value) (إرجاع (cout<< "first\n", value++) && (cout << "second\n", value++); }

لأي نوع ، سيتم دائمًا إخراج أولاً أولاً ثم ثانيًا. يتم الآن استبعاد الترتيب العكسي للإخراج بواسطة المعيار. هذا ، بالطبع ، ابتكار مهم للغاية يتيح لك التفكير في الكود المكتوب ، وليس حول ما سيتم إنشاؤه منه. من المثير للاهتمام ملاحظة أن هذا الابتكار أحدث فرقًا بين الاستدعاء الصريح والضمني لمشغل مثقل بالأعباء. فكر في مثال:

#يشمل استخدام اسم للمحطة؛ فئة SomeClass (مشغل int<<(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.

من الواضح ، مع إدخال النظام الجديد ، ظهرت العديد من التعبيرات المعقدة المختلفة التي أعطت أصبحت NPs في المعايير السابقة صالحة الآن ، لكن هذا لا يعني أنها يجب أن تبدأ في الظهور في الكود بشكل جماعي. لا ينبغي أن يكون ذلك لمجرد أنهم كذلك معقد، ويجب تجنب كل شيء يصعب فهمه. لكن القواعد الجديدة لا تمنحنا فقط القدرة على استدعاء وظائف مثل f (i ++ ، i ++) دون خوف من الحصول على برنامج معطل. تمنح القواعد الجديدة كود C ++ أكثر صرامة وترتيبًا ، وبفضل ذلك ، من بين أمور أخرى ، يمكننا الآن كتابة تعليمات برمجية موثوقة بسلسلة من الاستدعاءات (صريحة أو ضمنية ، لا يهم).

على الرغم من أنني قلت بعض "fi" عن الشفرة في كتاب Stroustrup ، إلا أنني بعيد كل البعد عن مكافحة التسلسل ، وإذا نظرنا إلى الكود الحديث المكتوب باستخدام لغات حتمية ، يمكننا أن نرى أنه يحتوي على المزيد والمزيد من السلاسل (على سبيل المثال ، LINQ و Task + ContinueWith من C # ، أو Lodash / التسطير السفلي و Promise + ثم من JS). تتحرك C ++ في هذا الاتجاه أيضًا ، وسنرى قريبًا Range-v3 والمستقبل + ثم ما يعادله للأمثلة المذكورة أعلاه في معايير C ++ المستقبلية. ولكن حتى قبل إصدار معايير جديدة ، يمكننا استخدام مكتبات مختلفة تشجع واجهتها على استخدام سلسلة استدعاء.

الكل في الكل ، في رأيي ، التغيير في قواعد تقييم التعبيرات هو أحد أهم الابتكارات في C ++ 17 التي سيلاحظها القليل من الناس ، لأن كل شيء (أو كل شيء تقريبًا) سيعمل بالطريقة التي يجب أن يعمل بها وفقًا إلى الفطرة السليمة. وهناك المزيد والمزيد من الفطرة السليمة في معيار C ++ كل يوم.

تقليل النسخ

من أولى خطوات تعلم لغة ++ C أن تتعلم منشئ النسخ. بعد كل شيء ، بمساعدته ، يمكنك بسهولة تحديد ما يتم نسخه ومتى يتم نسخه. أولئك. نكتب فصلنا الخاص ، ونضيف مُنشئ نسخة هناك ، ونكتب فيه الإخراج من خلال cout ، ونستمتع بالمخرجات ، ونتيجة لذلك نجد عدد النسخ التي أنشأناها.

مع ظهور دلالات الحركة ، أصبح الموقف أكثر تعقيدًا إلى حد ما ، لذلك من أجل الاكتمال ، نحتاج الآن أيضًا إلى إنشاء مُنشئ حركة. لكن بالنسبة لهذا القسم ، لا يهم ، لأن. كل ما يلي صحيح لكل من النسخ والنقل.

على سبيل المثال ، دعنا نكتب الكود التالي:

#يشمل استخدام اسم للمحطة؛ فئة SomeClass (عامة: SomeClass () = افتراضي ؛ SomeClass (const SomeClass &) (cout<< "Copy ctor called.\n"; } }; SomeClass meReturn() { return SomeClass{}; } int main() { auto some = meReturn(); };

كم مرة ستظهر عبارة "Copy ctor calling." على الشاشة إذا قمنا ببناء هذا الرمز على مترجم يقوم بتنفيذ C ++ 14 وتشغيل البرنامج؟ صفر ، مرة ، أو مرتين؟ الإجابة الصحيحة: غير معروف.

أولئك الذين جاءت الإجابة عليهم كمفاجأة يستحقون تفسيراً ننتقل إليه الآن. لذا ، بالنسبة للمبتدئين ، دعنا نكشف عن المعيار ونفكر في الحد الأقصى لعدد النسخ هنا ربماسيتم إنشاء. أكبر عدد ممكن من النسخ هنا هو الرقم 2: يتم إنشاء النسخة الأولى عند تنفيذ تعليمة الإرجاع ، ويتم إنشاء النسخة الثانية عند إنشاء كائن ما. ولكن إذا قمت بتشغيل هذا الرمز على مترجم حديث إلى حد ما (لا توجد مفاتيح إضافية!) ، فمن غير المحتمل أن ترى إخراجًا مزدوجًا ؛ النتيجة الأكثر احتمالا هي إما سطر واحد ، أو عدم وجود مخرجات على الإطلاق. سنقوم الآن بتعديل رمز وظيفتنا قليلاً ، وسيكون هذا هو الخيار الثاني:

SomeClass meReturn () (SomeClass some () ؛ إرجاع بعض ؛)

إذا قمنا بتنفيذ هذا الرمز على برامج التحويل البرمجي الشائعة ، فقد يتغير الإخراج أو لا يتغير (يتغير في MSVC 2017 ، في وضع التصحيح). أخيرًا ، سنقوم بتغيير رمز الوظيفة أكثر من ذلك بقليل ، ولكن هذه المرة فقط يتم ضمان تغيير الإخراج (بالنسبة للخيار الأول مع مراعاة الحالة الحالية للأشياء مع المجمعين):

SomeClass meReturn () (SomeClass some () ؛ إذا (خطأ) إرجاع SomeClass () ؛ إرجاع بعض ؛)

إذن ، الوظيفة هي نفسها في جميع المتغيرات ، لكن السلوك مختلف - ما الذي يحدث هنا على أي حال؟ ابدأ من جديد. وفقًا لمعيار C ++ ، في بعض الحالات قد لا يقوم المترجم بنسخ كائن ؛ هذا الوضع يسمى نسخ تخطي(الكمبيوتر الشخصي ، نسخة الإنجليزية elision). قائمة كاملة (قصيرة نوعًا ما) بالميزات التي يمكن استخدامها لتحديد ما إذا كان تخطي النسخ مسموحًا به موصوفة في class.copy / p31. نحن مهتمون بموقفين متشابهين ، لكن لا يزالان مختلفين.

في المثال الأصلي ، ترجع الدالة مؤقتًا مجهولشيء. في مثل هذه الحالة ، يكون للمترجم الحرية في حذف كلتا النسختين وإنشاء الكائن مباشرة في بعض النسخ. يُعرف هذا الوضع شعبياً باسم عودة القيمة الأمثل(OVZ ، الهندسة ، تحسين قيمة الإرجاع). إذا نظرنا إلى gcc / clang / MSVC ، يمكننا أن نرى أنه لمثل هذه الوظيفة يتخلصون من كلا النسختين ، وبالتالي سيكون الناتج فارغًا.

يُسمح بهذا التحسين ليس فقط للعودة ، ولكن أيضًا للأماكن الأخرى التي تحدث فيها التهيئة مع كائن مؤقت غير مسمى. لذلك ، إذا كانت لديك وظيفة meAccept (SomeClass) باطلة تسمى مثل meAccept (SomeClass ()) ، فإن المترجم له الحرية في حذف النسخة الزائدة عن الحاجة.

الآن دعنا ننتقل إلى الخيار الثاني ، حيث أنشأنا اسم الشيئكائن على المكدس. لم يتغير إخراج gcc / clang ، ولكن بالنسبة لـ MSVC (في وضع التصحيح) ظهر سطر واحد في الإخراج ، ومن الواضح أنه في هذه الحالة تخلص MSVC من النسخة الثانية فقط. بناءً على ما سبق ، يتضح أن المترجم يستخدم أيضًا جهاز الكمبيوتر ، ولكن هنا يحدث وفقًا لمعيار مختلف قليلاً: له الحق في التخلص من النسخ اسم الشيئالكائن في المكدس الذي تم إرجاعه من الوظيفة. يُعرف هذا التحسين شعبياً باسم يسمى تحسين قيمة الإرجاع(OIVZ ، اللغة الإنجليزية المسماة تحسين قيمة الإرجاع).

يعد هذا التحسين أكثر صعوبة بالنسبة للمترجم ، وهو ما نراه في الخيار الثالث ، حيث أضفنا كلمة if عديمة الفائدة تمامًا ، مما أجبر المجمعين الرئيسيين الثلاثة على المرور وعمل نسخة. وبالتالي ، يعد OIV تحسينًا "هشًا" أكثر من OIV البسيط ، ويتم تعطيله بشكل عام عندما يكون هناك العديد من العوائد المختلفة في الكود. هذه إحدى الحجج التي توضح أنه يجب أن يكون هناك عائد واحد فقط في الوظيفة (لا أستطيع أن أقول إن الحجة مقنعة للغاية).

حقيقة مثيرة للاهتمام هي أن التحسينات المذكورة أعلاه يتم تطبيقها في المجمعين حتى عندما نقوم بالتجميع مع تعطيل التحسينات (-O0 ، / Od). علاوة على ذلك ، يمكن إجبار دول مجلس التعاون الخليجي و clang فقط على عمل جميع النسخ. تحتاج إلى استخدام مفتاح -fno-elide-constructors للقيام بذلك ، ولن يقوم MSVC بإنشاء نسختين تحت أي ظرف من الظروف ، ولا توجد مفاتيح تبديل [عامة] لتعطيل هذا السلوك.

هناك نقطة أخرى يجب ذكرها. على الرغم من أنه في C ++ 14 يمكن للمجمع إزالة كلتا النسختين ، وبالتالي عدم تنفيذ مُنشئ النسخة ولو مرة واحدة ، يجب أن يتسبب في حدوث خطأ في الترجمة إذا لم يكن هناك مُنشئ من هذا القبيل. أولئك. إذا كتبنا هذا بدلاً من مُنشئ النسخة الحالي: SomeClass (const SomeClass &) = حذف، فلن يتم إنشاء البرنامج حتى عندما يتمكن المترجمون قانونًا من التخلص من النسخ - يجب أن يظل المنشئ كذلك.

وأخيرا النقطة الثالثة: الحركة. إذا كان بإمكان المترجم حذف النسخة ، فيمكنه حذف النقل. أولئك. في هذا الصدد هما متكافئان تمامًا. في هذا الصدد ، بالمناسبة ، هناك موقف مثير للاهتمام مرتبط. لا يفهم العديد من المبرمجين (استنتجت الكثير بناءً على الكود الذي رأيته على الشبكة) تمامًا دلالات النقل ويكتبون رمزًا مشابهًا لهذا: return std :: move (someObject). في المظهر ، الرمز غير ضار تمامًا ويعمل كما هو متوقع من قبل الشخص الذي كتبه ، هذا الرمز فقط مضمونيوقف OIVZ. هل تعتقد أنه من الأفضل عمل مُنشئ واحد رخيص أو لا تفعل شيئًا على الإطلاق؟

واقع جديد

حان الوقت الآن للنظر في ما تغير في C ++ 17 فيما يتعلق بجهاز الكمبيوتر. يمكن العثور على جميع التغييرات التي سنناقشها في هذا القسم كجزء من اقتراح P0135R1 الأصلي. إذا ألقيت نظرة على هذا المستند ، فسترى أنه يصف العديد من التغييرات على المعيار من حيث فئة التعبيرات (غالبًا قيمة) ، بالإضافة إلى العديد من التعديلات التي توضح المكان الذي تحتاج إلى تنفيذه بشكل صريح مباشر(مباشر) و نسخ(نسخة) التهيئة. من بين هذه المجموعة بأكملها ، نحن مهتمون فقط بتغيير واحد ، وهو موصوف في stmt.return / p2.

لذلك ، وفقًا للابتكار أعلاه ، فإن العودة من وظيفة كائن مؤقت غير مسمى (prvalue) من نفس النوع (أي لا يلزم التحويل) حيث يؤدي نوع إرجاع الوظيفة تهيئة النسخ للنتيجة (والتي ، وفقًا لـ dcl. init / p (17.6. 1) ، يسمح لك بتخطي النسخ). مكتوب في الجملة أعلاه هو في الأساس نفس "قياس الأثر الصحّي" ، هذه المرة فقط إلزامي. أولئك. إذا كان في مترجم C ++ 14 استطاعتخلص من النسخ / النقل في مثل هذه الحالة ، الآن يجبافعلها. ماذا يعطينا هذا ، لأننا رأينا بالفعل أن المترجم نفسه يقوم بعمل رائع؟ ويعطينا ما يلي ، بوجود هذا الرمز:

SomeClass meReturn () (إرجاع SomeClass () ؛)

لا يمكننا نسخ المنشئات ونقله على الإطلاق وسيظل تجميعه. من المهم ملاحظة أن الحالة فقط قد تغيرت عندما يتم إنشاء كائن آخر من كائن مؤقت غير مسمى ، ولكن إذا قمنا بإرجاع كائن مسمى (OIVZ) ، فعندئذٍ حتى إذا تمكن المترجم من تخطي النسخ ، فإن وجود المُنشئ المناسب مطلوب .

هناك شيء آخر مرتبط بالفعل بتمرير الوسيطات ، وليس القيم المرجعة. إذا كان لدينا هذا الرمز:

إبطال meAccept ([] SomeClass s) ()

بعد ذلك ، عند استدعاء وظيفة meAccept (SomeClass ()) ، لن يكون هناك أيضًا نسخ ، وهذا مرة أخرى لم يعد تحسينًا ، ولكنه أحد متطلبات المعيار. هذا يرجع إلى التغييرات في تعريف prvalue (basic.lval) وما يستتبعه هذا التغيير. دعنا نكسر هذا السطر: meAccept (SomeClass ()). من حيث القيمة القديمة ، SomeClass () هو كائن مؤقت ، والذي يتم نسخه بعد ذلك إلى معلمة الوظيفة. لكن التعريف الجديد لـ prvalue هو أنه لم يعد كذلك شيء، لكن تعبير، تقييمه هو تهيئة الكائن. ماذا يعني هذا بالنسبة لنا؟ هذا يعني أنه في التعبير الذي ندرسه ، فإن SomeClass () ليس كائنًا مؤقتًا ، ولكنه تعبير تهيئة معلمة دالة. هنا يتم تضمين القاعدة التي ذكرناها سابقًا في dcl.init / p (17.6.1) ، ولا يحدث نسخ - يتم إجراء التهيئة مباشرة.

للوهلة الأولى ، يعد هذا ابتكارًا غير مهم إلى حد ما ، لأن كل شيء كان يحدث بالطريقة نفسها ، إنه فقط أن المترجمين لم يكونوا مطالبين بفعل ذلك. ومع ذلك ، فقد غيّر هذا الابتكار جوهر مفهوم prvalue ، لذلك لا ينبغي اعتباره تافهًا. نعم ، ومن وجهة نظر عملية بحتة ، تحتاج إلى معرفة هذا التغيير ، لأنه عند تعلم لغة ما ، نتعلمها تجريبيًا ، وفي هذه العملية ، تكون التجارب مع منشئي النسخ / الحركة شائعة جدًا. لذلك ، بدءًا من C ++ 17 ، لا توجد طريقة يمكنك من خلالها إجبار المترجم على عمل نسخة في الأمثلة الموضحة مسبقًا. لن تساعد أي إشارات إذا تم تجميع البرنامج لـ C ++ 17 وكان المترجم يدعمه بالفعل. بالنسبة إلى الكود اليومي ، يتيح لك هذا الابتكار إنشاء وظائف المصنع التي تُرجع الكائنات التي لا تحتوي على مُنشئ نسخ / نقل. كم هو مطلوب؟ سوف يظهر الوقت.

لامدا

تواصل اللجنة إظهار حبهم لللامدا ، مضيفة شيئًا جديدًا لهم في كل مراجعة جديدة للمعيار. لم يكن عام 2017 استثناءً ، وتلقت لامدا نصيبها من الابتكارات. على الرغم من أنني ما زلت أنتظر بناء جملة قصير (مثل C # 's x => x) وأعتبر أن ابتكارات هذا المعيار طفيفة ، ما زلت لا أستطيع الالتفاف عليها.

التقاط هذا

إذن ، أول ابتكار. يمكنك الآن تمرير نسخة من كائن إلى قائمة الالتقاط باستخدام هذا المؤشر. قبل C ++ 17 ، إذا أردنا تمرير نسخة من الكائن الحالي إلى لامدا ، فاضطررنا لكتابة شيء مثل هذا:

#يشمل استخدام اسم للمحطة؛ فئة SomeClass (عامة: SomeClass (قيمة_الحجم): m_Value (القيمة) () void someMethod () (auto lambda = [_this = * this] (لـ (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 على إصلاح هذا القصور من خلال السماح لك بكتابة مثل هذا:

lambda تلقائي = [* هذا] (لـ (size_t i = 0 ؛ i< m_Value; ++i) cout << "This is lambda!!!\n"; };

أولئك. يتم الوصول إلى أعضاء الكائن بنفس الطريقة تمامًا كما لو أننا أنشأنا lambda مع قائمة الالتقاط هذه ، ولكن في هذه الحالة ، ليس الكائن الحالي (أي هذا المؤشر) ، ولكن يتم تمرير نسخته إلى lambda . أود أن أشير إلى أنني لم أضطر إلى كتابة مثل هذا الرمز ، لذلك من الصعب بالنسبة لي تقييم فائدة الابتكار ، ولكن من الواضح أنه سيصبح من السهل على أي شخص أن يعيش. لا يسعني إلا أن أكون سعيدًا من أجلهم وانتقل إلى الابتكار التالي.

بحاجة الى مزيد من الثبات!

التغيير الآخر الذي كان يطلب لفترة طويلة هو إضافة القدرة على استخدام lambdas في التعبيرات الثابتة. بالطبع ، يجب أن تكون هذه اللامدا ثابتة أيضًا. على سبيل المثال:

أحد عشر تلقائي = (إرجاع 11 ؛) ؛ مجموعة مصفوفة آر.

كما ترى ، لم يتغير شيء في تعريف لامدا ، لكن دعوتها تُستخدم في سياق يكون فيه استخدام ثابت وقت الترجمة أمرًا إلزاميًا. لأن يتم تجميع هذا الكود بنجاح ، يمكن لأي مبرمج دقيق أن يستنتج أن المشغل () للفئة التي تم إنشاؤها من lambda هو عضو constexpr ، وهذا الاستنتاج صحيح بلا شك. منذ C ++ 17 ، تكون جميع تعبيرات lambda عبارة عن constexpr افتراضيًا ، بينما كانت قبل C ++ 17 مجرد ثابت. ولكن سيتم إهمالها إلى ثابت إذا كان جسم دالة lambda لا يفي بواحد على الأقل من المعايير التي تلتزم بها جميع وظائف constexpr (تم وصف المعايير في dcl.constexpr). لنقم بإجراء تغيير طفيف على الكود الخاص بنا ، ولن تكون lambda عبارة عن constexpr:

11 تلقائي = (int x؛ return 11؛) ؛

مع مثل هذا لامدا ، سيعطي كود إنشاء المصفوفة خطأ في التجميع (وهو ما أردناه بالفعل) ، لكن إنشاء لامدا نفسه لن يعطي خطأ. ومع ذلك ، يمكننا شد البراغي ونطلب من لامدا أن يكون لها جسم يلتزم بالقواعد المذكورة أعلاه:

11 تلقائي = () constexpr (int x ؛ return 11 ؛) ؛

لاحظ أنه كان علينا إضافة كل من constexpr و () الواضحة ، والتي لا تحمل أي عبء وظيفي وتخدم فقط نزوات المعيار. وبالتالي ، يمكننا إنشاء دوال لامدا مضمونة لتكون قابلة للاستخدام في سياق كونستكسبر.

تم اقتراح هذا التغيير منذ فترة طويلة ، ولا ينبغي أن يكون مفاجئًا لأي شخص: يمكن أن تكون الوظائف البسيطة عبارة عن constexpr ، ويمكن أن تكون وظائف الأعضاء أيضًا ، فلماذا تكون لامدا أسوأ؟ ما مدى ضرورة كونستكسبر لامدا؟ هذا سؤال أكثر إثارة للاهتمام. أعتقد أن كود constexpr يحتاجهم بقدر ما يحتاجهم الكود البسيط. هناك ازدهار constexpr في C ++ في الوقت الحالي: يتنافس الأشخاص لمعرفة من يمكنه المضي قدمًا في نقل العمل من وقت التشغيل إلى وقت التجميع.

يذهبون إلى حد كتابة محلل JSON وحتى تنفيذ التعبيرات العادية (بالنسبة لأولئك المهتمين ، شاهد الفيديو من CppCon2017: "Constexpr كل الأشياء!"). بالإضافة إلى ذلك ، أصبح المزيد والمزيد من الخوارزميات القياسية (وليس كذلك) عبارة عن كونستكسبر ، مما يؤدي إلى الاستخدام الأكثر وضوحًا لللامدا ، لأنها مصنوعة ببساطة للخوارزميات. لذلك ، في رأيي ، تعد إضافة constexpr خطوة جيدة للأمام ، والتي ستسمح لك بكتابة المزيد من التعليمات البرمجية التي سيتم تنفيذها في وقت الترجمة.

من ناحية أخرى ، هل نحتاج حقًا إلى التحرك كثيرًا لتجميع الوقت؟ بالطبع ، عندما يمكن نقل شيء ما من تنفيذ ديناميكي متعدد إلى تنفيذ واحد في وقت الترجمة ، فهذه ميزة إضافية محددة. أم لا؟ يعتمد ذلك على المهمة والفوائد التي نحصل عليها أثناء التنفيذ. لنفترض أننا كتبنا محلل JSON يستهلك الكثير من ذاكرة الوصول العشوائي ويزيد من وقت التجميع (شاهد على الأقل الدقائق الثلاث الأخيرة من الفيديو أعلاه) ، ماذا يعطينا هذا؟ نعم ، يمكننا الآن تحليل التكوين في وقت الترجمة واستخدامه في الكود. لكن بعد كل شيء ، كان بإمكاننا فعل ذلك من قبل ، دون استخدام JSON ، وسيكون هذا أيضًا حملًا صفريًا على وقت التنفيذ (مجرد مجموعة من العلامات في الرأس ، على سبيل المثال). هذا يذكرني بنكتة ملتحية:

يلتقي صديقان:

- سمعت أنك اشتريت سيارة؟

- نعم! وكيف كان يعيش! الآن أستطيع أن أفعل كل شيء! بالأمس تمكنت من تغيير الزيت في يوم واحد ، وشراء إطارات جديدة ، وذهبت إلى سوق السيارات للمصدات ، وضربت على الفور خدمة السيارات وقمت بتغييرها ، وتوجهت أيضًا إلى المتجر للحصول على مضاد للتجميد. كيف يمكنني القيام بكل هذا بدون سيارة؟

قد أعترض على أن JSON أكثر ملاءمة. فليكن. ثم دعونا نضيف برنامجًا نصيًا في نفس لغة Python (أو CMake بشكل عام) ، والذي سينشئ لنا كائن تكوين من JSON. نعم ، سيتعين علينا إضافة خطوة أخرى لبناء مشروعنا ، ولكن هل هو أصعب من كتابة كود C ++ الذي يوزع JSON؟ ولم يقم أحد بإلغاء وقت التجميع (وأعتقد أن هذا السبب أكثر أهمية): إذا استغرق تجميع الشفرة وقتًا طويلاً ، فإن التطوير سيتحول إلى جحيم. لذلك لا أرى الهدف على الإطلاق من نقل الأشياء المعقدة إلى قضبان constexpr. في رأيي ، هذا تعقيد غير ضروري يمكن إظهاره في المؤتمرات ، ولكنه غير ضروري تمامًا في الكود الحقيقي. يجب تبرير استخدام حسابات وقت الترجمة ، ليس فقط لأننا "نستطيع الآن!".

قد تعطي الفقرتان الأخيرتان فكرة خاطئة عن موقفي تجاه هذا الابتكار: أنا لست ضده ، أنا فقط ضد دق الأظافر بالميكروسكوب ، هذا كل شيء. مثال على هذا الأخير مرئي بوضوح في فيديو CppCon ، لكن ظهور كونستكسبر لامدا هو بالتأكيد خبر جيد ، لأن لامدا ، وظيفيًا ، لا ينبغي أن تختلف بأي شكل من الأشكال عن الوظائف العادية - يجب أن تتمتع بنفس القدرات ، وإذا ذاكرتي لا تتغير ، لم يتبق سوى شيء واحد لإضافته: معلمات القالب المسماة لـ lambdas. هل ننتظرهم في C ++ 20؟

في أي موقف غير مفهوم ، اهدأ واستلقي وعانق نفسك واذهب وتناول الأطعمة اللذيذة. اعتني بأعصابك :)

اترك أخطاء في الماضي.

نقدر الحقيقي.

ابتسم للمستقبل

بمجرد أن تتخلى عن الموقف الذي يعذبك ، سيسمح لك الموقف على الفور بالرحيل.




لا تفزع. من غير المعروف ما يمكن أن يحدث في غيابك.

تعال إلى الشجرة. قد يعلمك السلام.

ما سر راحة بالك؟

أجاب السيد: "بقبول كامل لما لا مفر منه".

رتب الأشياء في أفكارك - وسترى العالم بعيون مختلفة.

لا تنس أن تنظف قلبك.

ما هي الراحة؟

لا توجد أفكار غير ضرورية.

وما هي الأفكار غير الضرورية؟

(وي تي هان)

أهم كنز لك هو السلام في روحك.

البابونج مهدئ.

تدبر حالتك المزاجية ، فإن لم تطيع ، فهي تأمر.


لا يمكنك أن تجد السلام إلا من خلال أن تصبح مراقبًا ، وتنظر بهدوء إلى مجرى الحياة العابر. ايرفين يالوم



الهدوء أقوى من العواطف.

الصمت أعلى من الصراخ.

ومهما حدث لك ، لا تأخذ أي شيء على محمل الجد. القليل في العالم مهم لفترة طويلة.

إريك ماريا ريمارك "قوس النصر" ---

عندما تعلق في المطر ، يمكنك أن تتعلم درسًا مفيدًا من هذا. إذا بدأت تمطر بشكل غير متوقع ، فأنت لا تريد أن تبتل ، لذلك تجري في الشارع إلى منزلك. لكن عندما تصل إلى المنزل ، تلاحظ أنك لا تزال مبتلاً. إذا قررت من البداية عدم تسريع وتيرتك ، فسوف تبتل ، لكنك لن تزعجك. يجب أن يتم نفس الشيء في ظروف أخرى مماثلة.

Yamamoto Tsunetomo - Hagakure. كتاب الساموراي



غدا سيكون ما ينبغي أن يكون

ولن يكون هناك شيء لا يجب أن يكون -

لا تزعج.

إذا لم يكن هناك سلام بداخلنا ، فلا جدوى من البحث عنه في الخارج.

غير مثقل بالمخاوف -
يستمتع بالحياة.
الكسب ليس سعيدًا
الخسارة لا تحزن ، لأنه يعلم
هذا المصير ليس دائما.
عندما لا نكون ملزمين بالأشياء
الصفاء معروف تمامًا.
إذا كان الجسد لا يرتاح من التوتر ،
تبلى.
إذا كانت الروح دائمًا في هموم ،
يتلاشى.

تشوانغ تزو -

إذا رميت كلبًا بعصا ، فسوف ينظر إلى هذه العصا. وإذا رميت أسدًا بعصا ، فسوف ينظر إلى القاذف دون أن ينظر إلى أعلى. هذه عبارة رسمية قيلت أثناء النزاعات في الصين القديمة ، إذا بدأ المحاور في التشبث بالكلمات وتوقف عن رؤية الشيء الرئيسي.

عندما أتنفس ، أهدئ جسدي وعقلي.
عندما أزفر ، أبتسم.
كوني في اللحظة الحالية ، أعلم أن هذه اللحظة مدهشة!

اسمح لنفسك بالتنفس بعمق ولا تدفع نفسك إلى إطار عمل.

القوة تعود إلى أولئك الذين يؤمنون بقوتهم.

طور عادة مراقبة حالتك العقلية والعاطفية من خلال المراقبة الذاتية. من الجيد أن تسأل نفسك بانتظام: "هل أنا هادئ في الوقت الحالي؟" هو سؤال مفيد لطرحه على نفسك بانتظام. يمكنك أيضًا أن تسأل: "ما الذي يحدث بداخلي في الوقت الحالي؟"

إيكهارت تول

الحرية هي التحرر من القلق. مع إدراك أنه لا يمكنك التأثير على النتائج ، لا تهتم برغباتك ومخاوفك. دعهم يأتون ويذهبون. لا تطعمهم باهتمام واهتمام. في الواقع ، تتم الأشياء معك ، وليس أنت.

نيسارجاداتا مهراج


كلما كان الشخص أكثر هدوءًا وتوازنًا ، زادت إمكانياته وزاد نجاحه في الأعمال الصالحة والجديرة. اتزان العقل من أعظم كنوز الحكمة.


أساس كل حكمة الهدوء والصبر.

توقف عن القلق وبعد ذلك يمكنك رؤية النمط الرائع ...

عندما يستريح العقل ، تبدأ في تقدير ضوء القمر ونفث الريح ، وتدرك أنه لا داعي للقلق الدنيوي.

ابحث عن السلام في روحك ، وسيتم إنقاذ الآلاف من حولك.

ما تريده حقًا هو السلام والمحبة. خرجتم منهم ، ستعودون إليهم وأنتم. باباجي


أجمل الناس وأصحاء هم أناس لا يتضايقون من أي شيء.


أعلى درجات الحكمة البشرية هي القدرة على الهدوء رغم العواصف الخارجية.



أنت لست ملزمًا بتجاربك ، بل بالتشبث بها.

لا تتخذ قرارات متسرعة. تزن جيدًا جميع الإيجابيات والسلبيات. تقريبا كل شخص لديه دليل سماوي ، "أنا" ثانية. فكر في الأمر واسأله هل يستحق فعل ما خططت له أم لا ؟! تعلم كيف تراقب ، لترى ما هو غير مرئي ، لتستبق المواقف.

عندما تفكر في غابات الجبال والجداول التي تجري فوق الأحجار ، فإن القلب المغطى بالأوساخ الدنيوية يتلاشى تدريجياً. عندما تقرأ الشرائع القديمة وتنظر إلى لوحات السادة القدامى ، فإن روح الابتذال الدنيوي تتبدد شيئًا فشيئًا. هونغ تسيشنغ ، طعم الجذور.


تأتي الحكمة مع القدرة على الهدوء. فقط شاهد واستمع. لا حاجة لأي شيء آخر. عندما تكون في سلام ، عندما تنظر وتستمع فقط ، فإنه ينشط ذكائك الخالي من المفاهيم بداخلك. دع السلام يهدي أقوالك وأفعالك.

إيكهارت تول


لا يمكننا أبدًا تحقيق السلام في العالم الخارجي حتى نحققه في الداخل.

جوهر التوازن هو عدم التمسك.

جوهر الاسترخاء هو عدم التراجع.

جوهر الطبيعة ليس بذل جهد.

من لا يحسد ولا يرغب في إلحاق الأذى بأحد قد حقق التوازن. بالنسبة له ، يمتلئ العالم كله بالسعادة.

من أجل أن تزدهر الحياة مرة أخرى ، تغرق وتمتلئ بالبهجة والسعادة المثيرة ، ما عليك سوى التوقف ... توقف واسمح لنفسك بالذوبان في المتعة ...

لا تقلق بشأن مستقبلك ، كن في سلام الآن وسيصبح كل شيء في مكانه.

إذا لم يتم تقليب الماء ، فسوف يستقر من تلقاء نفسه. إذا لم تكن المرآة متسخة ، فسوف تعكس الضوء من تلقاء نفسها. لا يمكن أن يطهر قلب الإنسان بالإرادة. القضاء على ما يلوثها ، فتظهر نقاوتها. الفرح لا يمكن العثور عليه خارج نفسك. اقضِ على ما يزعجك ، وسوف يسود الفرح في روحك من تلقاء نفسه.


في بعض الأحيان فقط اترك الأشياء وشأنها ...

دائمًا ما يكون الجو هادئًا في وسط الإعصار. كن ذلك المكان الهادئ في المركز ، حتى لو كانت الزوابع مستعرة.

انت السماء. كل شيء آخر هو الطقس فقط.

فقط في المياه الهادئة تنعكس الأشياء غير مشوهة.

فقط الوعي الهادئ مناسب لإدراك العالم.

عندما لا تعرف ماذا تفعل ، انتظر قليلاً. الزم الصمت. عش بالطريقة التي تعيش بها. ستظهر العلامة عاجلاً أم آجلاً. الشيء الرئيسي هو أن تعرف أنك تنتظر وأن تكون مستعدًا لتلبية ما تنتظره. لويس ريفيرا

لا تقلق بشأن مستقبلك ، كن في سلام الآن وسيصبح كل شيء في مكانه.


الهدوء يسرق القوة من أعدائك. في الهدوء لا يوجد خوف ولا غضب مفرط - فقط حقيقة خالية من التشوهات والتدخل من الانفعالات العاطفية. عندما تكون هادئًا ، فأنت قوي حقًا.

لذلك ، سيحاول خصومك دائمًا بكل قوتهم إخراجك من هذه الحالة - لإثارة الخوف ، وزرع الشكوك ، وإثارة الغضب. ترتبط الحالة الداخلية ارتباطًا مباشرًا بالتنفس. مهما كان الموقف الذي تجد نفسك فيه ، قم بتهدئة أنفاسك على الفور - ستهدأ الروح بعد ذلك.


أهم شيء في الحياة الروحية هو الحفاظ على القلب في سلام.

عليك أن تثق في الحياة.
من الضروري دون خوف أن يسلم المرء نفسه إلى تياره ، لأن الحياة أكثر حكمة منا بلا حدود.
لا تزال تعاملك بطريقتها الخاصة ، وأحيانًا بقسوة شديدة ،
لكن في النهاية ستدرك أنها كانت على حق.

كن في سلام الآن وكل شيء سوف يقع في مكانه.

لا تهيج روحك ولا تخرج من شفتيك كلمة شريرة. يجب أن تظل خيرًا ، بقلب مليء بالحب ، لا يحتوي على خبث خفي ؛ وحتى أولئك الذين يتمنون سوء المعاملة ، يجب أن تغلفهم بأفكار محبة ، وأفكار سخية ، عميقة لا حدود لها ، وخالية من كل الغضب والكراهية. هذه هي الطريقة ، يا تلاميذي ، يجب أن تتصرفوا.

فقط الماء الهادئ يعكس السماء بشكل صحيح.

أفضل مؤشر على مستوى الوعي هو القدرة على الارتباط بهدوء بصعوبات الحياة.

إنهم يسحبون الشخص اللاواعي لأسفل ، بينما يرتفع الشخص الواعي أكثر فأكثر إلى الأعلى.

إيكهارت تول.


اجلس بهدوء وستفهم مدى عبث المخاوف اليومية. اخرس قليلاً وستفهم كيف تكون الخطب اليومية فارغة. تخلَّ عن المشاكل اليومية ، وستفهم مقدار الطاقة التي يهدرها الناس سدى. تشن جيزو.


يساعدنا الهدوء على إيجاد طريقة للخروج من أصعب المواقف.

هل نفد صبرك؟ ... تضخيم مرة أخرى!)

3 ثوانٍ هادئة

يكفي التفكير بهدوء لمدة ثلاث ثوان لفهم كل شيء.

هذا فقط من أين تحصل عليهم ، هذه الثواني الثلاث الهادئة حقًا؟ نحن متحمسون جدًا لأوهامنا بحيث لا يمكننا التوقف ولو للحظة.


هل سبق لك أن رأيت شجرة بلوط في حالة من التوتر ، أو دولفين في مزاج كئيب ، أو ضفدع يعاني من تدني احترام الذات ، أو قطة لا تستطيع الاسترخاء ، أو طائر مثقل بالاستياء؟ تعلم منهم القدرة على تحمل الحاضر.
إيكهارت تول

خذ وقتك. يفتح كل برعم في وقته الخاص. لا تجبر البرعم على أن يصبح زهرة. لا تثني البتلات. هم لطيفون لقد آذيتهم. انتظر وسوف يفتحون أنفسهم. سري سري رافي شانكار

لا تعبدوا رجلاً ملتحياً في السماء أو صنماً في كتاب. عبادة الشهيق والزفير ، نسيم الشتاء يداعب وجهك ، حشد الصباح في مترو الأنفاق ، مجرد الشعور بالحياة ، لا تعرف أبدًا ما هو قادم.انظر الله في عيني غريب ، العناية الإلهية في الخراب والعادي. عبادة الأرض التي تقف عليها. اجعل كل يوم رقصة ، مع الدموع في عينيك ، والتأمل في الألوهية في كل لحظة ، ولاحظ المطلق في كل شيء قريب ، ودع الناس يدعونك بالجنون. دعهم يضحكون ويمزحون.

جيف فوستر

القوة العليا ليست القدرة على هزيمة الآخرين ، ولكن القدرة على أن تصبح واحدًا مع الآخرين.

سري تشينموي

حاول ، على الأقل بطريقة بسيطة ، ألا تستدرك بذهنك.
انظر إلى العالم - فقط انظر.
لا تقل "أعجبني" أو "لم يعجبني". لا تقل أي شيء.
لا تقل الكلمات ، انظر فقط.
سيشعر العقل بعدم الارتياح.
عقلي يود أن يقول شيئا.
أنت فقط تقول للعقل:
"كن هادئًا ، دعني أرى ، سأشاهد فقط" ...

6 نصيحة حكيمة من تشن جيرو

1. اجلس بهدوء وسوف تفهم مدى عبث المخاوف اليومية.
2. اصمت قليلاً وستفهم كم هي فارغة الخطب اليومية.
3. تخلَّ عن المشاكل اليومية ، وسوف تفهم مقدار الطاقة التي يهدرها الناس سدى.
4. أغلقوا بواباتكم ، وسوف تفهمون مدى إرهاق روابط التعارف.
5. لديك القليل من الرغبات ، وسوف تفهم سبب تعدد أمراض الجنس البشري.
6. كن أكثر إنسانية ، وسوف تفهم كيف أن الناس العاديين بلا روح.

حرر عقلك من الأفكار.
دع قلبك يهدأ.
اتبع بهدوء الاضطرابات في العالم
شاهد كل شيء في مكانه ...

من السهل التعرف على الشخص السعيد. يبدو أنه يشع بهالة من الهدوء والدفء ، ويتحرك ببطء ، لكنه تمكن من فعل كل شيء ، ويتحدث بهدوء ، لكن الجميع يفهمه. سر الناس السعداء بسيط - إنه غياب التوتر.

إذا كنت جالسًا في مكان ما في جبال الهيمالايا وكان الصمت يحيط بك ، فهو صمت جبال الهيمالايا ، وليس صمتك. يجب أن تجد جبال الهيمالايا الخاصة بك داخل ...

تستغرق جروح الفكر وقتًا أطول للشفاء من أي جروح أخرى.

رولينغ ، "هاري بوتر وجماعة العنقاء"

تأتي الحكمة مع القدرة على الهدوء.فقط شاهد واستمع. لا حاجة لأي شيء آخر. عندما تكون في سلام ، عندما تنظر وتستمع فقط ، فإنه ينشط ذكائك الخالي من المفاهيم بداخلك. دع السلام يهدي أقوالك وأفعالك.

إيكهارت تول "ماذا يقول الصمت"

كلما كان الشخص أكثر هدوءًا وتوازنًا ، زادت إمكانياته وزاد نجاحه في الأعمال الصالحة والجديرة. اتزان العقل من أعظم كنوز الحكمة.

جيمس ألين

عندما تعيش في وئام مع نفسك ، يمكنك التعايش مع الآخرين.

الحكمة الشرقية -

أنت تجلس وتجلس ؛ تذهب - وتذهب بنفسك.
الشيء الرئيسي - لا تزعج عبثا.

غير موقفك تجاه الأشياء التي تزعجك ، وستكون في مأمن منها. (ماركوس أوريليوس)

اجذب انتباهك إلى الضفيرة الشمسية. حاول أن تتخيل أن كرة شمسية صغيرة تضيء في داخلك. دعها تشتعل ، تصبح أكبر وأقوى. دع أشعتها تنيرك. دع الشمس تشبع جسمك كله بأشعةها.

الانسجام هو التكافؤ في كل شيء. إذا كنت تريد إثارة ضجة ، فعد حتى 10 و "ابدأ" الشمس.

الهدوء والهدوء فقط :)

كن مهتمًا بما يحدث بداخلك ، بما لا يقل عن ما يحيط بك. إذا كان كل شيء على ما يرام في العالم الداخلي ، فسيكون كل شيء في مكانه في العالم الخارجي.

إيكهارت تول ---

الجاهل والجاهل خمس علامات:
غاضب من دون سبب
يتكلم دون داع
تغيير بدون سبب
التدخل في أمور لا تهمهم على الإطلاق ،
ولا أعرف كيف تميز من يتمنى لهم الخير ومن - من - الشر.

المثل الهندي -

ما يذهب ، دعه يذهب.
ماذا يأتي ، دعه يأتي.
ليس لديك شيء ولم يكن لديك سوى نفسك.

إذا تمكنت من الحفاظ على صمت داخلي غير ملوث بالذكريات والتوقعات ، يمكنك رؤية نمط جميل من الأحداث. قلقك هو الذي يخلق الفوضى.

Nisargadatta مهراج ---

هناك طريقة واحدة فقط للسعادة ، وهي التوقف عن القلق بشأن الأشياء الخارجة عن إرادتنا.

ابكتيتوس -

عندما نفقد إحساسنا بالأهمية الذاتية ، نصبح غير معرضين للخطر.

لكي تكون قوياً ، عليك أن تكون مثل الماء. لا توجد عقبات - إنها تتدفق ؛ السد - سوف يتوقف ؛ السد ينكسر - سوف يتدفق مرة أخرى ؛ في وعاء رباعي الزوايا يكون رباعي الزوايا ؛ في الجولة - إنها مستديرة. نظرًا لأنه متوافق جدًا ، فهو مطلوب بشدة وهو الأقوى على الإطلاق.

العالم مثل محطة سكة حديد ، حيث ننتظر دائمًا ، ثم في عجلة من أمرنا.

عندما يتباطأ عقلك وحواسك إلى ضربات القلب ، فإنك تدخل تلقائيًا في انسجام مع الإيقاع الكوني. تبدأ في إدراك العالم بعيون إلهية ، تراقب كيف يحدث كل شيء بمفرده وفي وقته الخاص. عندما تجد أن كل شيء يتوافق بالفعل مع قانون الكون ، فإنك تفهم أنك لست مختلفًا عن العالم وربه. هذه هي الحرية. Mooji

نحن نعاني كثيرا. نحن نأخذ الأمر على محمل الجد. يجب أن يكون كل شيء أسهل. لكن بحكمة. لا أعصاب. الشيء الرئيسي هو التفكير. ولا تفعل أشياء غبية.

ما يمكنك أن تأخذه بهدوء لم يعد يتحكم فيك ...

لا يوجد مكان يمكن للمرء أن يجد فيه السلام لمن لم يجده في أنفسهم.

أن تكون غاضبًا ومنزعجًا ليس سوى معاقبة النفس على غباء الآخرين.

انت السماء. والغيوم هي ما يحدث ، تأتي وتذهب.

إيكهارت تول

عش بسلام. تعال الربيع ، والزهور تتفتح.


من المعروف أنه كلما بدا الشخص أكثر هدوءًا ، قلَّت معارضته وتجادله مع الآخرين. على العكس من ذلك ، إذا دافع شخص عن وجهة نظره بقوة ، فإنه يجادل ويقاوم بعنف.

لا تستعجل. تأكل في ساعة الطعام ، وستأتي ساعة الرحلة- انطلق الى الطريق.

باولو كويلو "الخيميائي"

الخضوع يعني قبول ما هو موجود. إذن أنت منفتح على الحياة. المقاومة عبارة عن مشبك داخلي .... إذن أنت مغلق تمامًا. مهما فعلت في حالة المقاومة الداخلية (والتي يمكن تسميتها أيضًا بالسلبية) ، فإنها ستسبب المزيد من المقاومة الخارجية ، ولن يكون الكون بجانبك ، ولن تساعدك الحياة. الضوء لا يمكن أن يدخل من خلال مصاريع مغلقة. عندما تستسلم داخليًا وتتوقف عن القتال ، ينفتح بُعد جديد للوعي. إذا كان العمل ممكنًا ... فسيتم ... مدعومًا بالعقل الإبداعي ... الذي ، في حالة الانفتاح الداخلي ، تصبح واحدًا. ثم تبدأ الظروف والأشخاص بمساعدتك ، لتصبح واحدًا معك. هناك مصادفات سعيدة. كل شيء في صالحك. إذا لم يكن العمل ممكنًا ، فأنت في سلام وسلام داخلي يأتي مع عدم القتال.

إيكهارت تول نيو إيرث

رسالة "تهدئة" مزعج لسبب ما دائما أكثر.مفارقة أخرى.عادة بعد هذه المكالمةلا أحد يفكر في الهدوء.

مرآة برنارد ويربر كاساندرا

من أذل نفسه هزم الأعداء.

سلوان آثوس

الهدوء هو الذي يحفظ الله في نفسه.


عندما تتجادل مع أحمق ، فمن المرجح أنه يفعل نفس الشيء.

القوة الحقيقية للإنسان ليست في النبضات ، بل في الهدوء الراسخ.

أعلى درجات الحكمة البشرية هي القدرة على التكيف مع الظروف والبقاء هادئين رغم العواصف الخارجية.

ستختفي المشاعر والأفكار المتداخلة إذا لم تنتبه لها. لما اولي نضال

لن تندم أبدًا على ما تمكنت من الصمت بشأنه.
- حكمة شرقية -

يجدر بنا أن نكافح من أجل مثل هذه الحالة من الوعي التي يُنظر فيها إلى جميع الأحداث بشكل محايد.

الهدوء والنظام وراحة البال العامة - هذه هي الحالات المطلوبة لكل شخص. تمر حياتنا بشكل أساسي مثل التأرجح - من المشاعر السلبية إلى النشوة ، والعكس صحيح.

كيف تجد نقطة توازن وتحافظ عليها بحيث يُنظر إلى العالم بشكل إيجابي وهادئ ، ولا شيء يزعج أو يخيف ، واللحظة الحالية تجلب الإلهام والفرح؟ وهل من الممكن أن تجد راحة البال على المدى الطويل؟ نعم هذا ممكن! علاوة على ذلك ، إلى جانب السلام تأتي الحرية الحقيقية والسعادة البسيطة للعيش.

هذه قواعد بسيطة ، وهي تعمل دينياً. تحتاج فقط إلى التوقف عن التفكير في كيفية التغيير والبدء في تطبيقها.

1. توقف عن التساؤل "لماذا حدث هذا لي؟" اطرح على نفسك سؤالاً آخر: "ما هو الشيء الرائع الذي حدث؟ ما فائدة هذا بالنسبة لي؟ " الخير موجود ، عليك فقط رؤيته. أي مشكلة يمكن أن تتحول إلى هبة حقيقية من فوق ، إذا كنت تعتبرها فرصة وليست عقابًا أو ظلمًا.

2. ممارسة الامتنان. تلخيص كل مساء: لما يمكنك أن تقوله "شكرًا" لليوم الذي عشت فيه. إذا فقدت راحة البال ، فتذكر الأشياء الجيدة التي لديك والأشياء التي يمكنك أن تكون ممتنًا لها في الحياة.

3. تحميل الجسم بالتمارين البدنية. تذكر أن الدماغ ينتج بشكل أكثر نشاطًا "هرمونات السعادة" (الإندورفين والإنكيفالين) أثناء التدريب البدني. لذلك ، إذا تغلبت عليك المشاكل والقلق والأرق - اخرج وامش لعدة ساعات. ستؤدي الخطوة أو الجري السريع إلى تشتيت الانتباه عن الأفكار الحزينة ، وتشبع الدماغ بالأكسجين ورفع مستوى الهرمونات الإيجابية.

4. طور "وضعية مرحة" وخلق لنفسك وضعية سعيدة. يمكن للجسم أن يساعد بشكل رائع عندما تحتاج إلى استعادة راحة البال. سوف "يتذكر" الشعور بالبهجة إذا قمت فقط بتصويب ظهرك ، وتقويم كتفيك ، وتمدد بسعادة وتبتسم. ثبّت نفسك بوعي في هذا الوضع لفترة من الوقت ، وسترى أن الأفكار في رأسك تصبح أكثر هدوءًا وثقة وسعادة.

5. أعد نفسك إلى هنا والآن. يساعد التمرين البسيط على التخلص من القلق: انظر حولك وركز على ما تراه. ابدأ عقليًا "بالتعبير" عن الصورة ، وإدخال أكبر عدد ممكن من الكلمات "الآن" و "هنا". على سبيل المثال: "أنا أسير في الشارع الآن ، والشمس مشرقة هنا. الآن أرى رجلاً يحمل أزهارًا صفراء ... "وهكذا. تتكون الحياة من لحظات "الآن" فقط ، لا تنس ذلك.

6. لا تبالغ في مشاكلك. بعد كل شيء ، حتى لو اقتربت ذبابة من عينيك ، فسوف تأخذ حجم الفيل! إذا كانت بعض التجارب تبدو مستحيلة بالنسبة لك ، فكر كما لو أن عشر سنوات قد مرت بالفعل ... كم عدد المشاكل التي كانت موجودة من قبل - لقد قمت بحلها جميعًا. لذلك ، ستمر هذه المشكلة أيضًا ، فلا تغوص فيها برأسك!

7. اضحك أكثر. حاول أن تجد شيئًا مضحكًا في الوضع الحالي. إنه لا يعمل - إذن فقط ابحث عن سبب للضحك الصادق. شاهد فيلمًا مضحكًا ، وتذكر حادثة مضحكة. قوة الضحك مذهلة! غالبًا ما تعود راحة البال بعد جرعة جيدة من الفكاهة.

8. يغفر أكثر. الاستياء يشبه الأحجار الثقيلة ذات الرائحة الكريهة التي تحملها معك. أي راحة بال يمكن أن تكون مع مثل هذا العبء؟ لذلك ، لا تحمل الشر. الناس مجرد أشخاص ، لا يمكن أن يكونوا مثاليين ولا يجلبون سوى الخير دائمًا. لذا اغفر للمذنبين واغفر لنفسك.

10. تواصل أكثر. أي ألم مختبئ بالداخل يتكاثر ويعطي ثمارًا حزينة جديدة. لذلك ، شارك تجاربك ، ناقشها مع أحبائك ، ابحث عن دعمهم. تذكر أن الرجل ليس من المفترض أن يكون بمفرده. لا يمكن العثور على راحة البال إلا في العلاقات الحميمة - الصداقة والحب والأسرة.

11. الصلاة والتأمل. لا تدع الأفكار السيئة تتحكم فيك وتزرع الذعر والألم والانزعاج. قم بتغييرها إلى صلاة قصيرة - نداء إلى الله أو إلى التأمل - حالة من عدم التفكير. أوقف التدفق الجامح للمحادثات الداخلية. هذا هو أساس الحالة الذهنية الجيدة والمستقرة.