سؤال

void problem3(void) {
    int overflowme[16];
    int x = (int) problem3; // x is the address of the first instr for problem3
    printf("hello world\n");
    overflowme[17] = x; 

أنا أتساءل ماذا تفعل (int) في البرمجة C.

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

المحلول

إنه عبارة عن خطأ، ويخبر المحول البرمجي "تجاهل النوع الذي يحتوي على المشكلة 3 حقا، والتعامل معها كما لو كانت مكتوبة باعتبارها كثافة".

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

نصائح أخرى

إنه ممثل صريح. تقوم بإلقاء قيمة المشكلة 3 إلى عدد صحيح ثم قم بتعيين القيمة الصحيحة إلى x.

لاحظ أن هذا لا يغير فعليا قيمة المشكلة 3.

إنه من النوع يلقي - إنه شكل من أشكال تحويل نوع المعامل (problem3 في مثالك) إلى نوع آخر.

في C (وفي C ++ عندما يتم استخدام Coast Coast C-style)، يمكن للمضاع أن يقوم المصبوب بإجراء واحد من العديد من الأشياء:

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

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

  • reinterpret_cast<>() الذي يتوافق مع النموذج الأول الموصوف أعلاه
  • static_cast<>() الذي يتوافق مع النموذج الثاني (حتى لو كان التحويل لا يؤدي إلى تغيير تنسيق البيانات الداخلي)
  • const_cast<>() وهي حالة خاصة من الصب القادرة على إزالة const أو volatile التصفيات التي قد يتم تطبيقها على كائن
  • dynamic_cast<>() وهو جديد تماما على C ++ وليس له وظيفة مماثلة في C. يتم استخدام هذا المشغل لإجراء نوع كائن أساسي "Downcast" بأمان إلى أحد أنواعها المشتقة.

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

في مثالك، problem3 هو مؤشر إلى وظيفة، والذي يلقي "تحويل" العنوان لهذه الوظيفة إلى int. ثم تقوم بتخزين هذا العنوان - كما هو الحال في الصفيف، ولكن في الواقع عنصر صفيف واحد الماضي في نهاية الصفيف (وهو رقم لا). في العديد من المنصات التي يتم فيها تخزين عنصر الصفيف غير صالح حيث يتم تخزين عنوان المرسل للدالة، فماذا سيحدث عندما يكون problem3() عودة الدالة، وسوف تعود إلى حد ذاتها وتشغيلها مرة أخرى (إعلان إنفينيتوم - نوعا).

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

كما لاحظ البعض الآخر أن هذا هو مجرد ممثلين صريحين. انها مجرد تغيير نوع المتغير في int يكتب.

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

انها typecast أي. يحول المتغير / ثابت بعد ذلك إلى النوع المحدد. هنا، يتم تحويل نوع الفراغ (*) (الفراغ) إلى int (شيء في الأقواس)

هذا يعني انه problem3 يتم تحويلها إلى اكتب int قبل التعيين إلى int x

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