ملخص
يمكن لتعبير في C++ أن يفعل أمرين مختلفين: أن يعطي قيمة، وأن يغيّر حالة البرنامج. فـ x + 1 يعطي قيمة فقط؛ وx = 7 يعطي قيمة ويغيّر فوق ذلك x؛ وx++ يعطي القيمة التي كانت لـ x ويترك في x قيمة أخرى. يدرس هذا الدرس ذلك الفرق بين القيمة والأثر في التعبير: الإسناد بوصفه تعبيرًا، والإسناد المركّب، والزيادة والإنقاص في صيغتيهما البادئة واللاحقة، والترتيب الذي تُحسب به أجزاء التعبير، وهو ترتيب لا يحدّده المعيار إلا جزئيًا. ومن ذلك يلزم السؤال الذي ينتظم بقية الدرس: ماذا يعد المعيار بشأن البرنامج؟ والجواب فهرس من أربع درجات، من السلوك المعرَّف إلى غير المعرَّف، يجمع كل الحالات التي رأيناها حتى الآن، ويقول في كل منها ما الذي يكشفها (المترجم، أو الكاشف، أو المكتبة) وما الذي لا يكشفه أحد.
أهداف التعلم
- أن يميّز قيمة التعبير من أثره الجانبي في الإسنادات والزيادات والاستدعاءات.
- أن يتنبّأ بنتيجة
x++و++xحين يُستعملان قيمةً، وأن يتتبّع يدويًا برنامجًا فيه إسنادات مركّبة. - أن يتعرّف التعابير التي تعدّل متغيرًا مرتين، أو تقرؤه وتعدّله، دون ترتيب يحدّده المعيار، وأن يعيد كتابتها في تعليمات منفصلة.
- أن يصنّف بنيةً بأنها معرَّفة، أو معرَّفة من قِبل التنفيذ، أو غير محدَّدة، أو غير معرَّفة، مع مثال لكل صنف.
- أن يقول، في كل سلوك غير معرَّف من الفهرس، هل ينبّه إليه المترجم، أو يوقفه الكاشف أو المكتبة، أو لا يكشفه أحد.
القيمة والأثر
درس الدرس العمليات الحسابية التعبير بوصفه شجرة تُختزل إلى قيمة: 2 + 3 * 4 قيمته 14، وحسابه لا يغيّر شيئًا خارج التعبير نفسه. وصنع الدرس العلاقات والمنطق الشيء نفسه مع الشروط، التي قيمتها true أو false. غير أن ثمة تعابير تترك، فضلًا عن إعطاء قيمة، أثرًا في حالة البرنامج: تغيّر قيمة متغير، أو تكتب على الشاشة، أو تقرأ من المدخلات. هذا الأثر يسمّى الأثر الجانبي، أو ببساطة الأثر، وكلمة «الجانبي» لا تعني أنه أقل أهمية: ففي x = 7 الأثر، أي أن تصير قيمة x مساوية لـ 7، هو بالضبط المقصود.
وإذا كان الأمر كذلك، فينبغي أن يُقرأ كل تعبير بسؤالين: ماذا يعطي وماذا يفعل. ثلاثة أمثلة تثبّت هذا التمييز. count + 1 يعطي العدد الذي يلي count ولا يفعل شيئًا: فـ count تحتفظ بقيمتها. وcount = 9 يعطي 9 ويجعل قيمة count مساوية لـ 9. وstd::println("مرحبا") تعبير أيضًا، استدعاء لدالة، والمهم فيه أثره: كتابة سطر. وستُدرس الدوال التي نكتبها بأنفسنا في الدرس الدوال، وهناك سيعود هذا التمييز: الدالة التي تحسب نتيجتها فقط أسهل فهمًا واختبارًا من دالة تغيّر فوق ذلك شيئًا خارجها.
التعليمة مثل count + 1; شيفرة C++ صالحة: تُحسب القيمة ثم تُهمَل، فلا فائدة منها، وينبّه GCC إلى ذلك بالخيار -Wunused-value. فتعليمة التعبير تكتسب معناها من أثرها. ومن ذلك يلزم أن التعابير ذات الأثر هي التي تحرّك البرنامج، وهي أيضًا التي تتطلّب الحذر، لأن الأثر يقع في لحظة ما، وتلك اللحظة ليست دائمًا التي يفترضها القارئ.
جارٍ تحميل المحتوى…