ملخص
يختم هذا الدرس الوحدة الثانية من الدورة، المخصّصة للبيانات وأنواعها. فهو يعيد بناء سلسلة المفاهيم الممتدة من المتغير إلى الثابت الذي يراقبه المترجم، مرورًا بالتمثيل الثنائي للأعداد الصحيحة ونوعَي فيضانها، والأعداد الحقيقية التقريبية وهامش التسامح، والمحارف بوصفها رموزًا، والتحويلات التي تُضيع المعلومات؛ ويفصل ما يصحّ من ذلك في أي لغة عمّا يخصّ C++؛ ويجمع السلوك غير المعرَّف في الوحدة، مع ما يكشفه المترجم وما يكشفه الكاشف (sanitizer) وما لا يكشفه أحد؛ ويكرّر في تقييم الخروج مهارات تقييم الدخول؛ وينتهي بستة تحدّيات تجمع الوحدة كلها.
أهداف التعلم
- اختيار نوع كل معطًى في مسألة وتعليله بحسب القيم التي يمكن أن يأخذها، والدقة التي يتطلبها، والعمليات التي ستُجرى عليه.
- التنبؤ بآثار حدود التمثيل في برنامج معطًى: فيضان الأعداد الصحيحة، وتقريب الفاصلة العائمة، وضياع المعلومات في التحويل.
- استعمال الثوابت المسمّاة والتحويلات الصريحة، وشرح ما يتحقق منه المترجم في كل حالة.
- التعرّف على السلوك غير المعرَّف في الوحدة، وبيان ما يكشفه في كل حالة وكيف يُتّقى.
- الفصل، فيما تعلّمناه في الوحدة، بين ما يصحّ في أي لغة وما يخصّ C++.
ما حقّقته الوحدة
وضعت الوحدة لنفسها غاية أن تعلّم أن كل معطًى يعيش في الذاكرة بنوع يحدّد القيم التي يمكن أن يأخذها، والمساحة التي يشغلها، والعمليات التي يقبلها، وأن لهذه الحدود آثارًا يمكن ملاحظتها. وقد تحقّقت الغاية استنادًا فقط إلى ما أعلنته المقدمة معلومًا: دورة العمل من الترجمة والتنفيذ بخيارات الدورة، والإخراج المنسَّق، والقراءة بـ std::cin، وقراءة رسائل المترجم. والبرنامج ذو الحسابات الأربع الذي طرحت به المقدمة المسألة يمكن الآن شرحه سطرًا سطرًا، وتصحيحه.
المتغيرات والذاكرة
أرسى درس المتغيرات والذاكرة أن المتغير خانة في الذاكرة لها اسم ونوع ثابت وقيمة تتغيّر، وأن النوع يحدّد حجمه الذي يقيسه sizeof. وميّز التهيئة من الإسناد، وبيّن أن الأقواس المعقوصة ترفض التحويل الذي فيه ضياع، وعلّم أن الإسناد ينسخ ولا يربط، وأن القيمة المستبدَلة تضيع، ومن ذلك يلزم المتغير المساعد في تبديل قيمتين. وعرّف حالة البرنامج بأنها مجموعة قيم متغيراته، وعلّم تتبّعها بجدول التتبع. وثبّت أعراف التسمية، واختتم بأول سلوك غير معرَّف في الوحدة: قراءة متغير لم يتلقَّ قيمة قط.
الأعداد الصحيحة وتمثيلها
علّم درس الأعداد الصحيحة وتمثيلها نظام العدّ الموضعي في الأساسات 10 و2 و16. ومن كون النوع ذا بت استنتج مدى قيمه: من أنماط البتات، تمثّل دون إشارة الأعداد من إلى ، ومع الإشارة، بالمتمِّم الثنائي، من إلى ، بعدد سالب يزيد واحدًا على الموجبة. وميّز نوعَي الفيضان: فيضان الأعداد الصحيحة عديمة الإشارة، وهو حساب بترديد ومعرَّف (0u - 1 يساوي )، وفيضان الأعداد الصحيحة ذات الإشارة، وهو سلوك غير معرَّف يوقفه الكاشف. وبيّن أن مقارنة عدد صحيح ذي إشارة بعدد عديم الإشارة تحوّل الأول، فتكون المقارنة خاطئة، وانتهى بمعيار لاختيار النوع الصحيح بحسب المدى المتوقَّع للمعطى.
أعداد الفاصلة العائمة
بيّن درس أعداد الفاصلة العائمة أن العدد الحقيقي يُحفظ إشارةً وأسًّا وجزءًا معنويًا ثنائيًا، بحيث تكون القيم القابلة للتمثيل مجموعة منتهية من الأعداد النسبية مقاماتها قوى للعدد 2. ومن ذلك لزم أن العدد غير موجود في الآلة: يُحفظ مكانه أقرب قيمة double، و0.1 + 0.2 يُكتب 0.30000000000000004. ووضع الدرس حدًّا لخطأ كل تقريب، وبيّن أن الأخطاء تتراكم وأن الجمع يكفّ عن أن يكون تجميعيًا؛ ومن ثَمّ استنتج أن عددين حقيقيين محسوبين لا يُقارَنان بـ ==، بل بالمسافة بينهما، مع هامش تسامح مسوَّغ. وثبّت double نوعًا حقيقيًا افتراضيًا، وقدّم اللانهاية والقيمة التي ليست عددًا، NaN.
المحارف والقيم المنطقية والتحويلات والثوابت
بيّن درس المحارف والقيم المنطقية والتحويلات والثوابت أن النوع قاعدة لقراءة البتات: يحفظ char بايتًا قيمته رمز ASCII للمحرف، ولأن للأرقام والحروف رموزًا متتالية فإن '7' - '0' يساوي 7؛ وقيمة bool صواب أو خطأ، وكل عدد غير الصفر يتحوّل إلى صواب. ودرس التحويلات الضمنية وأرسى أن التحويل يحدث داخل العملية، بحسب نوع المعاملات، لا عند حفظ النتيجة: في double r{7 / 2} تكون القيمة 3. وعلّم كتابة التحويل المقصود بـ static_cast، الذي لا يمنع الضياع بل يعلنه؛ ودقّق أن الأقواس المعقوصة ترفض التضييق، وبيّن السلوك غير المعرَّف الثالث في الوحدة، تحويل عدد حقيقي لا يتّسع له النوع إلى عدد صحيح. واختتم بالثوابت (const وconstexpr وstatic_assert)، ونوع القيم الحرفية، وauto.
جارٍ تحميل المحتوى…