سؤال

كيف يمكن للمرء أن يقوم بتوضيح جيد لسبب عدم تصحيح الكود التالي ، حيث يحاول المؤلف كتابة رمز C ++ بشكل إعلاني بدلاً من الإجرائي؟

const double NEWTONS_PER_POUND = 4.448;

int main()
{
   double pounds, newtons;
   pounds = newtons/NEWTONS_PER_POUND; /* pounds equals 'unassigned variable'/4.448 */
   newtons = 10.0;
   cout << pounds << endl;             /* a big number, not 10.0/4.448 */
   return 0;
}

المتوقع المؤلف cout لعرض حساب مناسب ، ولكن بدلاً من ذلك يحصل على "رقم مجنون".

أود أن أشرح هذا على أنه "C ++ إجرائي ، وبالتالي في وقت الإعلان

pounds = newtons/NEWTONS_PER_POUND;

newtons لم يتم تعيين قيمة.

أي اقتراحات أفضل؟ أو شرح لماذا C ++ ليس "ذكي" بما يكفي لتنفيذ السلوك الذي توقعه المستخدم عن طريق الخطأ؟

هل كانت مفيدة؟

المحلول

أخبر المؤلف ذلك

pounds = newtons/NEWTONS_PER_POUND;

أوامر وحدة المعالجة المركزية إلى

  • خذ القيمة في العنوان المشار إليه باسم "Newtons"
  • خذ القيمة في العنوان المشار إليه باسم "Newtons_per_pound"
  • اقسم لهم
  • تخزين النتيجة على العنوان المشار إليه باسم "الجنيه"

ما يبحث عنه هو على الأرجح وظيفة من الناحية الضرورية:

double newtons_to_pounds(double newtons) {
  return newtons/NEWTONS_PER_POUND;
}

...

newtons = 10.0;
cout << newtons_to_pounds(newtons) << endl;    /* a big number, not 10.0/4.448 */
return 0;

نصائح أخرى

C ++ هي لغة برمجة ضرورية وليست حلول معادلة.

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

إليك التفسير التفصيلي:

double pounds, newtons;
pounds = newtons/NEWTONS_PER_POUND;
newtons = 10.0;

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

البيان الثاني يقرأ قيمة newtons (الذي يمكن أن يكون أي شيء) ويقسمه NEWTONS_PER_POUND. يتم تعيين النتيجة (التي يمكن أن تكون أي شيء) pounds.

البيان الثالث يهيئة newtons, ، ولكن بعد فوات الأوان للتأثير على الحساب الذي أجريناه للتو.

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

لا يوجد شيء خاص على الإطلاق لطريقة C ++ للتعامل مع هذا ، كما أنه لا يقتصر على برمجة الكمبيوتر - بل هي طريقة يومية للتعامل مع قائمة التعليمات المطلوبة.

إنه ليس كسول تقييم نيوتن

على هذا النحو ، يتم إجراء الحساب في وقت الإعلان ، وليس في وقت الطلب. إنه بعد رمز وظيفي ، وليس ما سيفعله C ++.

إذا لم يكن الشخص تقنيًا بشكل مفرط ، فيمكنك المحاولة:

"تشبه العبارات في برنامج C ++ الخطوات المطلوبة لصنع كعكة. يجب عليك تنفيذ الخطوات واحدة تلو الأخرى ويجب أن يتم تنفيذها بترتيب معين حتى يكون نجاحًا."

اشرح أن الجنيه يتم تعيين قيمة على السطر مع مشغل المهمة:

pounds = newtons/NEWTONS_PER_POUND;

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

ماذا عن التنقل عبر الكود في مصحح الأخطاء؟

IME لا يوجد شيء مثل هذا لفهم تنفيذ برنامج مكتوب بلغة إجرائية (أي ، على غرار كيفية تنفيذ وحدة المعالجة المركزية فعليًا).

أنت تحاول الحصول على المستمع للخضوع لتحول النموذج - لتغيير نهجه الكامل لفهم هذا الرمز.

"الجنيه" هو مجرد رقم. ليس لديه مفهوم لكيفية خلقه. أنت تخبر "جنيه" كيف تم إنشاؤه ، لن يتذكر ذلك. سوف يتذكر فقط ما هو ، وليس كيف يتم إنشاؤه.

قد يبدو غريباً بعض الشيء بالنسبة إلى مجموعة من الذاكرة. :-)

خذ مثالًا أكثر تعقيدًا قليلاً حيث يشبه المتغير newtons يتم إعادة استخدامه وتعيين القيم أكثر من مرة. على سبيل المثال:

double pounds, newtons;

newtons = 10.0;
pounds = newtons/NEWTONS_PER_POUND;
cout << pounds << endl;

newtons = 15.0;
pounds = newtons/NEWTONS_PER_POUND;
cout << pounds << endl;

return 0;

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top